web-dev-qa-db-ja.com

「SplFileInfo :: getSize():stat failed」例外がLaravel 6.0でファイルのアップロード時に発生する

Laravel 6.0を使用して、簡単な画像アップロードシステムを構築しています。

しかし、奇妙な理由で、画像が正しいフォルダに正常にアップロードされたにもかかわらず、「SplFileInfo :: getSize():stat failed」例外が発生し続けます... 1)この例外をスキップして、それを隠す2)それを完全に修正しますか?

Max_file_sizeやpost_max_sizeなどをより高い値に変更し、Apacheを再起動する解決策を見つけました。私はそれを試しましたが、それもうまくいきませんでした...そして、これに対する明確な解決策はないようです。

これがアップロード機能のために私のコントローラーにあるものです

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();
        }
    }

MySQLを使用して、画像が関連付けられている投稿、コントローラによって生成されたファイル名、マシン内の画像が保存されている場所などの写真情報を保存しています...ご覧のとおり、別のフォルダを作成しています組織化の目的で各投稿に...

目標は、少なくとも例外の原因を無効にすることです。それ以外の場合は問題なく動作します...アップロードが完了したら、理論的にはページを更新するだけです。

3
Richard Kim

UはFileクラスでサイズを取得できます

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

0
dılo sürücü

また、ファイルを操作するために古代の方法を使用している場合は、次のように注意してください。

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

よりモダンなものに移行する必要があります。

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

この非推奨のメソッドはエラー自体を引き起こすからです。 (5.5から6.0に更新)

0
Adam Olecký

私も同じ問題が発生しました。解決策として、nullable関数をテーブルに追加しました。

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

laravel 6. *のドキュメントを読むと、ファイルのアップロードにstoreメソッドを使用できます。ファイルをpublicまたはpublic_htmlに最初に実行したい場合はphp artisan vendor:publishおよびconfig->filesystems.php新しいディスクを定義する(例:public_localそして、このディスクのルートをパブリックアドレスに設定します。

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

次に、このディスクにファイルを保存するには、ファイルに一意の名前を設定するstoreメソッドを使用するか、カスタム名でstoreasを使用します。

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

laravel 5.4で停止したイメージの保存方法を最初にドキュメントで読んでください。5.4laravelでドキュメント化されている最新バージョンを使用してください

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

ここで、imagesは宛先パスであり、filename.jpgは、自動生成された一意のIDとパスが必要ない場合の名前です。

それが役に立てば幸い

0
Fahadi Muhumuza

それを機能させることができなかったので、Laravel 5.5からの古いアプローチを使用しますが、それでも機能します。

   $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

「SplFileInfo :: getSize():C:\ xampp\tmp\phpE84D.tmpのstatが失敗しました」というエラーが発生しました

解決方法-

元のファイル名をDBに保存していましたが、db列のサイズはvarchar 30で、アップロードしたファイルのファイル名は長すぎました。だから私は短い名前でファイルの名前を変更するとき。アップロードされました。それで、列のサイズを増やして、得たものをこのエラーがなくなっていました。

したがって、ファイルアップロードコードで関数$ image-> getClientOriginalName()を使用してそれをDBに保存する場合は、ファイル名を検証するか、db列のサイズを増やす必要があります。

0
Amit Gupta