Laravelで画像アップロード機能を実装するステップバイステップ

Webアプリケーション開発において、ユーザーが画像を投稿できる機能は欠かせません。ブログ記事のアイキャッチ画像、プロフィール写真、商品画像など、さまざまな場面で必要になりますよね。しかし、初心者の方にとって「ファイルのアップロード」は少し複雑で、どこから手をつければいいか迷ってしまうかもしれません。 ご安心ください!Laravelを使えば、画像アップロード機能は驚くほど簡単に実装できます。Laravelの持つ便利な機能「ストレージ」や「バリデーション」を活用することで、セキュリティを確保しつつ、シンプルでわかりやすいコードを書くことができます。 この記事では、Laravel初心者の方でも迷わないよう、画像アップロード機能の仕組みから、実際に動作するコードまでを、ステップバイステップで丁寧に解説します。この記事を読めば、あなたも自信を持って画像アップロード機能を自分のアプリケーションに追加できるようになるはずです。

処理の大まかな流れ

フォーム作成 input type=”file” バリデーション 画像形式チェック 保存処理 storageに保存 表示 ブラウザに出力

画像アップロードの準備

まずは環境を整えましょう。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>

以下のようなフォームが表示できれば成功です

レスポンシブ対応tailwindをつかったアップロードフォーム

アップロード後の確認メッセージ 🎉

アップロードが成功したら、ユーザーにメッセージを表示しましょう。

@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アプリに欠かせない機能であり、仕組みを理解すればポートフォリオや実務で大いに活用できます。今回の解説を参考に、ぜひ手を動かしながら自分のアプリに組み込んでみてください。小さな成功体験を積み重ねることで、自信を持ってエンジニアとしてのスキルを磨けるでしょう。