Webアプリケーション開発において、ユーザーが画像を投稿できる機能は欠かせません。ブログ記事のアイキャッチ画像、プロフィール写真、商品画像など、さまざまな場面で必要になりますよね。しかし、初心者の方にとって「ファイルのアップロード」は少し複雑で、どこから手をつければいいか迷ってしまうかもしれません。 ご安心ください!Laravelを使えば、画像アップロード機能は驚くほど簡単に実装できます。Laravelの持つ便利な機能「ストレージ」や「バリデーション」を活用することで、セキュリティを確保しつつ、シンプルでわかりやすいコードを書くことができます。 この記事では、Laravel初心者の方でも迷わないよう、画像アップロード機能の仕組みから、実際に動作するコードまでを、ステップバイステップで丁寧に解説します。この記事を読めば、あなたも自信を持って画像アップロード機能を自分のアプリケーションに追加できるようになるはずです。
処理の大まかな流れ
画像アップロードの準備
まずは環境を整えましょう。Laravelのプロジェクトがすでにある前提で進めます。
- Laravel 10.x
- PHP 8.1以上
- storageディレクトリの書き込み権限
🌟 Tip: storage:link を忘れずに!
php artisan storage:link
フォームの作成 📝
画像をアップロードするためのフォームを作成します。Bladeテンプレートを使って、Bootstrapで装飾しましょう。
<form action="{{ route('upload') }}" method="POST" enctype="multipart/form-data" class="form-horizontal">
@csrf
<div class="control-group">
<label class="control-label">画像を選択</label>
<div class="controls">
<input type="file" name="image">
</div>
</div>
<div class="form-actions">
<button type="submit" class="btn btn-primary">アップロード</button>
</div>
</form>
バリデーションの設定 🔍
コントローラーでバリデーションを設定します。画像ファイルのみ受け付けるようにしましょう。
public function upload(Request $request)
{
$request->validate([
'image' => 'required|image|mimes:jpeg,png,jpg,gif|max:2048',
]);
$path = $request->file('image')->store('public/images');
return back()->with('success', '画像をアップロードしました!');
}
画像の保存と表示 🌈
保存した画像を表示するには、storageへのリンクが必要です。表示部分のコードは以下の通りです。
<img src="{{ asset('storage/images/' . basename($path)) }}" class="img-polaroid" style="max-width:100%; height:auto;">
レスポンシブ対応のポイント 📱
Tailwind CSSを使用することで、スマートフォンからデスクトップまで、あらゆるデバイスで適切に表示されるフォームを簡単に作成できます。以下に、一般的な画像アップロードフォームのHTMLと、それを構成するTailwindクラスのポイントを説明します。
画像アップロードフォームは、input type=”file”と、ユーザーインターフェースを向上させるためのラベルやボタンで構成されます。Tailwindのクラスを適用することで、美しいデザインとレスポンシブ対応を両立できます。
<div class="max-w-md mx-auto p-4 bg-white rounded-xl shadow-lg sm:p-6">
<label class="block text-center mb-4 cursor-pointer">
<!-- ファイル選択エリア -->
<div class="w-full p-6 text-center border-2 border-dashed border-gray-300 rounded-lg hover:border-blue-500 transition-colors duration-200">
<svg class="mx-auto h-12 w-12 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 16a4 4 0 01-4-4v-1a4 4 0 014-4h5.586a1 1 0 01.707.293l2.828 2.828a1 1 0 00.707.293h1.414A4 4 0 0121 12v1a4 4 0 01-4 4h-1" />
</svg>
<p class="mt-2 text-sm font-medium text-gray-600">画像をドラッグ&ドロップ</p>
<p class="text-xs text-gray-500">またはクリックしてファイルを選択</p>
</div>
<!-- 実際のファイル入力要素 -->
<input type="file" class="sr-only" accept="image/*" />
</label>
<button type="submit" class="w-full mt-4 py-2 px-4 bg-blue-600 text-white font-semibold rounded-lg hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors duration-200">
画像をアップロード
</button>
</div>
以下のようなフォームが表示できれば成功です

アップロード後の確認メッセージ 🎉
アップロードが成功したら、ユーザーにメッセージを表示しましょう。
@if(session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
よくある質問(FAQ)❓
storage/app/public/images の代わりに config/filesystems.php を編集して、任意のディレクトリに変更できます。
はい、inputタグに multiple 属性を追加し、コントローラー側でループ処理を行えば可能です。
まとめ 🌟
Laravelで画像アップロード機能を実装する流れを一通り学んできました。フォームの作成から始まり、バリデーションで安全性を担保し、ストレージへ保存、そしてブラウザでの表示までをステップごとに整理すると、思ったよりもシンプルに仕組みが理解できたはずです。特に enctype="multipart/form-data"
の設定や storage:link
コマンドなど、初心者がつまずきやすいポイントを押さえることで、無駄なエラーに悩まされる時間を減らせます。また、複数ファイル対応やS3などの外部ストレージ利用に発展させれば、より実践的なアプリケーションにも応用可能です。画像アップロードはWebアプリに欠かせない機能であり、仕組みを理解すればポートフォリオや実務で大いに活用できます。今回の解説を参考に、ぜひ手を動かしながら自分のアプリに組み込んでみてください。小さな成功体験を積み重ねることで、自信を持ってエンジニアとしてのスキルを磨けるでしょう。