Laravelでファイルアップロード付きフォームを実装する方法
生徒
「先生、Laravelで画像やファイルをフォームからアップロードしたいんですが、どうやってやるんですか?」
先生
「Laravelではファイルアップロード専用の仕組みがあります。フォーム側の設定とController側の処理を正しく書くことで簡単に実装できます。」
生徒
「フォーム側では何を気をつける必要がありますか?」
先生
「ファイルを送信する場合、フォームにenctype="multipart/form-data"属性を追加する必要があります。これがないとファイルが正しく送信されません。」
1. Bladeテンプレートでフォームを作る
Bladeテンプレートでファイルアップロード用のフォームを作る例です。
<form action="{{ route('upload.store') }}" method="POST" enctype="multipart/form-data">
@csrf
<div class="mb-3">
<label for="title" class="form-label">タイトル</label>
<input type="text" name="title" class="form-control" id="title" value="{{ old('title') }}">
</div>
<div class="mb-3">
<label for="file" class="form-label">ファイルを選択</label>
<input type="file" name="file" class="form-control" id="file">
</div>
<button type="submit" class="btn btn-primary">アップロード</button>
</form>
ポイントはenctype="multipart/form-data"です。これがないとファイルがサーバーに送信されません。また、@csrfはLaravelのセキュリティ対策で必ず必要です。
2. Controllerでファイルを受け取る
ControllerではRequestを使ってファイルを受け取ります。ファイルの保存場所や名前もここで設定できます。
public function store(Request $request)
{
// バリデーション
$request->validate([
'title' => 'required|max:50',
'file' => 'required|file|mimes:jpg,png,pdf|max:2048'
]);
// ファイルの保存
if ($request->hasFile('file')) {
$path = $request->file('file')->store('uploads', 'public');
}
// データベース保存など
// Example: Upload::create(['title' => $request->title, 'path' => $path]);
}
ポイントはhasFile()でファイルが存在するか確認し、store()で指定のディレクトリに保存することです。mimesは許可するファイル形式、maxは最大サイズを指定できます。
3. 保存先と公開設定
上記の例ではpublic/storage/uploadsに保存されます。Laravelではデフォルトでstorage/app/publicに保存され、php artisan storage:linkコマンドを実行するとpublic/storageからアクセスできるようになります。
4. アップロード後のファイル表示
保存したファイルをBladeで表示するには、保存パスを使います。
<img src="{{ asset('storage/' . $upload->path) }}" alt="アップロード画像" class="img-fluid">
これでユーザーはアップロードしたファイルや画像をブラウザで確認できるようになります。
5. ファイルアップロード付きフォームの注意点
- フォームに
enctype="multipart/form-data"を必ず設定する - ファイル形式とサイズをバリデーションでチェックする
- 保存先ディレクトリと公開設定を確認する
- アップロード処理は
Requestで受け取り、Controllerで分離して管理する
これらを守ることで、安全で使いやすいファイルアップロードフォームを作ることができます。