web-dev-qa-db-fra.com

Exception "SplFileInfo :: getSize (): stat a échoué" Laravel 6.0 lors du téléchargement de fichiers

J'utilise Laravel 6.0 pour construire un système de téléchargement d'images simple.

Mais pour une raison étrange, je continue de rencontrer une exception "SplFileInfo :: getSize (): stat failed" même si l'image est correctement téléchargée dans le bon dossier ... est-ce que je peux faire pour 1) ignorer cette exception et le cacher 2) le réparer entièrement?

J'ai vu une solution pour changer max_file_size et post_max_size etc etc à une valeur plus élevée et redémarrer Apache. J'ai essayé, mais cela n'a pas fonctionné non plus ... et il semble qu'il n'y ait pas de solutions claires pour cela.

Voici ce que j'ai sur mon contrôleur pour la fonction de téléchargement

public function fileUpload(Request $request) {
        $this->validate($request, [
            'img' => 'required|image|mimes:jpeg,png,jpg,',
        ]);

        if ($request->hasFile('img')) {
            $image = $request->file('img');
            $size = $image->getSize();
            $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
            $charactersLength = strlen($characters);
            $randomString = '';
            for ($i = 0; $i < 5; $i++) {
                $randomString .= $characters[Rand(0, $charactersLength - 1)]; // Generate random 5 character name...
            }
            $name = $randomString.'.'.$image->getClientOriginalExtension();
            $destinationPath = public_path('storage'.'\\'.$request->input('post'));

            // Store Image Information //
            $data = new Photo();
            // Get post number //
            $data->order = $request->input('post');
            $data->filename = $name;
            $data->location = $destinationPath;
            $data->save();

            // Now move to the destination path //
            $image->move($destinationPath, $name);

            return refresh();
        }
    }

J'utilise MySQL pour stocker des informations sur les photos, telles que la publication à laquelle l'image est associée, le nom de fichier généré par le contrôleur et où dans la machine l'image est stockée ... comme vous pouvez le voir, je crée des dossiers séparés pour chaque poste à des fins d'organisation ...

Le but est au moins de désactiver la cause d'exception, sinon tout fonctionne correctement ... Je devrais théoriquement simplement rafraîchir la page une fois le téléchargement terminé.

3
Richard Kim

U peut obtenir la taille avec la classe File

$size = File::size($pathFile);

0
dılo sürücü

Gardez également à l'esprit, si vous utilisez des méthodes anciennes pour manipuler avec un fichier, par exemple:

 $request->pdf_file->move(storage_path(self::DIRECTORY), $fileName);

Vous devriez vous orienter vers une utilisation plus moderne:

 $file = $request->file('pdf_file');

Parce que cette méthode obsolète provoquera une erreur elle-même. (mise à jour de 5.5 à 6.0)

0
Adam Olecký

J'ai également le même problème. Comme solution, je viens d'ajouter la fonction nullable à la table.

public function up()
{
    Schema::create('logos', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('favicon')->nullable();
        $table->string('homepage_logo')->nullable();
        $table->string('otherpage_logo')->nullable();
        $table->string('preloader')->nullable();
        $table->timestamps();
    });
}

LogoController.php

public function store(Request $request)
{
    $input = $request->all();
    if($request->has('favicon') || $request->has('homepage_logo') || $request->has('otherpage_logo') || $request->has('preloader')){

        $favicon = $request->file('favicon');

        $favicon_name =  time().'.'.$favicon->getClientOriginalName();

        $folder = 'empathy/adminpanel/assets/img/icon/';

        $favicon->move($folder, $favicon_name);

        $input['favicon']= $favicon_name;
    }
    Logo::create($input);
}
0
ufuk

En lisant la documentation de laravel 6. * vous pouvez voir pour télécharger le fichier que vous pouvez utiliser la méthode store. Si vous voulez stocker le fichier dans public ou public_html lors de la première exécution php artisan vendor:publish et en config->filesystems.php définir de nouveaux disques par exemple avec le nom de public_local et définissez la racine de ce disque sur l'adresse publique:

'public_local' => [
            'driver' => 'local',
            'root' => public_path(),
        ],

puis pour stocker le fichier sur ce disque, vous pouvez utiliser la méthode de stockage qui définit un nom unique pour votre fichier ou utiliser des magasins avec un nom personnalisé: avec la méthode de stockage:

$path = $request->file('image_url')->store($imagePath, 'public_local');
$path = $request->file('image_url')->storeAs($imagePath, 'custom_name', 'public_local');
0
behnam shateri

Veuillez d'abord lire la documentation sur la façon dont vous enregistrez une image a été arrêtée dans laravel 5.4 utilisez la dernière version documentée par laravel

$path = $request->photo->store('images');
$path = $request->photo->storeAs('images', 'filename.jpg');

images est le chemin de destination et filename.jpg est le nom si vous ne voulez pas d'un identifiant unique généré automatiquement avec un chemin

J'espère que ça aide

0
Fahadi Muhumuza

Impossible de le faire fonctionner, j'utilise donc l'ancienne approche de Laravel 5.5, et cela fonctionne toujours:

   $filenameWithExt = $request->file('image')->getClientOriginalName();
   $filename = pathinfo($filenameWithExt, PATHINFO_FILENAME);
   $extension = $request->file('image')->getClientOriginalExtension();
   $fileNameToStore = $filename . '_' . time() . '.' . $extension;
   $path = $request->file('image')->storeAs('public/profile_images', 
   $fileNameToStore);
   $user->profile_image = $fileNameToStore;
   $user->save();
0
Armin

J'obtenais cette erreur "SplFileInfo :: getSize (): stat a échoué pour C:\xampp\tmp\phpE84D.tmp"

Comment je l'ai résolu -

Parce que j'enregistrais le nom de fichier d'origine dans DB mais ma colonne db avait la taille varchar 30 et le fichier que j'avais téléchargé ce nom de fichier était trop long. Donc, quand je renomme le fichier avec un nom plus court. Cela a été téléchargé. Alors j'ai augmenté la taille de ma colonne et ce que j'ai obtenu, cette erreur a disparu.

Donc, si quelqu'un utilise la fonction $ image-> getClientOriginalName () dans votre code de téléchargement de fichier et l'enregistre dans la base de données, vous devez valider le nom du fichier ou augmenter la taille de la colonne db.

0
Amit Gupta