0

これが私の現在の問題です。

現時点では、AJAX を介して追加および追加できる要素を含むページがあります。これらの要素には、フォーム、画像のアップロードなどが含まれます。

アプリケーション全体に、任意の時点でアップロードされる画像のサイズをチェックし、5MB 未満であることを確認するミドルウェアがあります (アプリケーションでの各画像アップロードの画像検証はオプションではありません。すべての画像アップロードの検証)。

リクエストで 5MB を超える画像が検出された場合、このコードが実行されます

return redirect()->back()->withInput($request->all())->withErrors(array('Image' => 'Sorry, ' . $file->getClientOriginalName() . ' is too large, maximum file size is 5MB. Please reduce the size of your image!'));

このコードは非常に気まぐれです。その理由は次のとおりです。

ページが返されたときに、ページを残したのとまったく同じ状態にする必要があります。つまり、AJAX で読み込まれたすべての要素、すべての画像、すべてが同じ状態である必要があるredirect()->back()->withInput($request->all())ため、ページが更新され、そのインスタンスに追加および追加されたすべての読み込みが削除されるため、機能しません。

リクエストが失敗した場合、リクエストをキャンセルできる必要があります。

簡単に言えば、このミドルウェアを実行すると、すべての画像が検出されます。5MB を超える画像がある場合は、ページを更新しないでください。ただのエラー

リクエストは更新せずに何かを返すことができないため、これはばかげているように思えますが、私は id ask / open 提案を考えました。

ここに私のミドルウェアがあります

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\UploadedFile;
use Symfony\Component\HttpFoundation\Response;

class ImageInterceptor
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
         foreach (array_filter(array_flatten($request->files->all())) as $file) {
             //Check if the file being uploaded is not a csv
            if($file->getClientOriginalExtension() != 'csv'){
                $filename = $file->getClientOriginalName();
                $size = $file->getClientSize(); // size in bytes! 
                $onemb = pow(1024, 2);
                if ($size > $onemb * 5) { 
                    //Return back, image is too big!
                    return redirect()->back()->withInput($request->all())->withErrors(array('Image' => 'Sorry, ' . $file->getClientOriginalName() . ' is too large, maximum file size is 5MB. Please reduce the size of your image!'));
                }
            }
        }

        return $next($request);
    }
}
4

1 に答える 1