MENU

blog
スタッフブログ

dot
[Laravel]アップロードサイズ確認Middleware
技術

[Laravel]アップロードサイズ確認Middleware

こんにちは!
ソリューションセクションの日野です。

最近は暑すぎてしんどいですね・・・(xox)
熱中症も増えているようなのでしっかり水分補給していきましょう!

本題

さて、Laravelでファイルのアップロードが同じ画面に複数ある場合、
php.iniの設定に引っかかったことはないでしょうか

そう、私も引っかかりましたよ
post_max_sizeとupload_max_filesizeに・・・。

post_max_sizeは20Mに、upload_max_filesizeは8Mくらいに変更しましたが、
それでもエラーになる場合、エラーの表示をいい感じにしたい・・

そう思ってRequestバリデーションにファイルサイズの制限を入れるものの
php.iniではじかれてるのでそこまで到達せず設定したエラーが表示されない・・・

なんてことがありました。

なのでphp.iniの設定を確認してエラーを表示するMiddlewareを作成しました

今回はpost_max_sizeだけを確認しているのですが、
取得する値をupload_max_filesizeにしても大丈夫です。

ソースコード

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class UploadSizeCheckMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        if (isset($_SERVER['CONTENT_LENGTH'])) {
            $postMaxSize = $this->return_bytes(ini_get('post_max_size'));
            $uploaded_size = intval($_SERVER['CONTENT_LENGTH']);

            if ($postMaxSize < $uploaded_size) {
                $errors = new \Illuminate\Support\MessageBag();
                $errors->add('img_file_name', '合計ファイルサイズが大きすぎます');
                return redirect($request->header('referer'))->withInput()->withErrors($errors);
            }
        }
        return $next($request);
    }

    public function return_bytes($val)
    {
        $val = trim($val);
        $unit = $val[strlen($val) - 1];
        $_val = substr($val, 0, strlen($val) - 1);

        if ($unit == 'G')
            return intval($_val) * 1024 * 1024 * 1024;

        if ($unit == 'M')
            return intval($_val) * 1024 * 1024;

        if ($unit == 'K')
            return intval($_val) * 1024;
    }
}

ini_get(‘post_max_size’)の部分でphp.iniから設定を取得しています

後はこれをApp\Http\Kernel.phpの$middleware配列の中に追加します

<?php

//他は省略してます
use App\Http\Middleware\UploadSizeCheckMiddleware;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        //他は省略してます
        UploadSizeCheckMiddleware::class,
    ];

そうすればpost_max_size以上のデータがポストされたときに
エラーが表示されるかと思います!

最後に

php.iniの設定変えるとこまでは結構紹介されてるんですけど
エラーメッセージ変更したいとかはないのかな?
いや、参考にしたサイトがあるのでやりたい人はいるはず・・
少しでも役立てば幸いです!

それでは!

参考サイト

https://pointsandlines.jp/server-side/php/laravel-post_max_size

dot
dot
PAGETOP