【Laravel】ファイルアップロード時のバリデーションと保存処理|画像・PDF対応とサイズ制限

【Laravel】ファイルアップロード時のバリデーションと保存処理|画像・PDF対応とサイズ制限 Laravel

Laravelでは、フォームからアップロードされたファイルを簡単に処理する機能が備わっています。画像やPDFのような特定ファイルの受け入れ、ファイルサイズの上限設定、保存処理まで、セキュリティと実用性の両面から対応が可能です。この記事では、ファイルアップロードに必要なバリデーションと保存処理の方法について詳しく解説します。

ファイルアップロードフォームの作成

まずはHTML側にファイルアップロード用のフォームを作成します。

<form method="POST" action="{{ route('upload') }}" enctype="multipart/form-data">
  @csrf
  <input type="file" name="file">
  <button type="submit">アップロード</button>
</form>

enctype="multipart/form-data" を忘れずに指定することで、ファイルを正しく送信できます。

ルートの定義

routes/web.phpにアップロード処理用のルートを追加します。

use App\Http\Controllers\UploadController;

Route::post('/upload', [UploadController::class, 'store'])->name('upload');

コントローラの作成

以下のコマンドでアップロード用コントローラを作成します。

php artisan make:controller UploadController

作成したコントローラに、バリデーションと保存処理を記述します。

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class UploadController extends Controller
{
    public function store(Request $request)
    {
        $request->validate([
            'file' => 'required|file|mimes:jpeg,png,pdf|max:5120', // 5MBまで
        ]);

        $path = $request->file('file')->store('uploads', 'public');

        return back()->with('message', 'アップロードが完了しました:' . $path);
    }
}

この例では、JPEG・PNG画像またはPDFのみを許可し、5MB(5120KB)までのサイズ制限を設けています。

保存先の設定と注意点

store()の第1引数はディレクトリ名、第2引数には「ディスク名(例:public)」を指定します。保存されたファイルはstorage/app/public/uploadsに配置されます。

アップロードファイルを公開ディレクトリからアクセス可能にするには、以下のコマンドを一度実行しておく必要があります。

php artisan storage:link

これにより、public/storageからファイルにアクセスできるようになります。

保存ファイルの情報を取得

アップロード後にファイル名などを取得したい場合は、以下のようなプロパティを利用できます。

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

$originalName = $file->getClientOriginalName(); // 元のファイル名
$extension = $file->getClientOriginalExtension(); // 拡張子
$size = $file->getSize(); // バイト単位のサイズ

アップロード可能なファイルの種類(mimes)

Laravelのmimesルールで指定できる主な拡張子は以下のとおりです。

  • jpeg, png, gif:画像ファイル
  • pdf:PDFファイル
  • doc, docx:Wordファイル
  • xls, xlsx:Excelファイル
  • csv, txt:テキストファイル

必要に応じてmimes:ルールをカスタマイズすることで、特定形式のみ受け付ける設計が可能です。

アップロード失敗時のエラー表示

Bladeテンプレート内でバリデーションエラーを表示するには、以下のように記述します。

@if ($errors->any())
  <ul>
    @foreach ($errors->all() as $error)
      <li>{{ $error }}</li>
    @endforeach
  </ul>
@endif

まとめ

Laravelでは、ファイルアップロード処理をシンプルかつ安全に実装することが可能です。適切なバリデーションと保存先の制御、CSRF保護、公開設定を行うことで、セキュアなファイルアップロード機能を構築できます。

画像、PDF、文書ファイルなどを扱うシステムで、ぜひ活用してみてください。