1. HOME
  2. ブログ
  3. エンジニアリング
  4. Laravelの画像アップロードを徹底解説

BLOG

ブログ

エンジニアリング

Laravelの画像アップロードを徹底解説

本章では、Laravelで画像アップロードができるように設定し、アップロード後のパスをデータベースに保存する方法について学んでいきます。

SNSアプリの以下の機能を作成します。

  • プロフィールアイコン画像変更
  • 新規投稿画像作成

チュートリアルの全体像

本チュートリアルを通じて学べる内容は以下のようになります。

  1. Laravelの開発環境セットアップ
  2. Laravel Breezeで認証機能を導入
  3. Laravelのルーティングを徹底解説
  4. Laravelのコントーラーを徹底解説
  5. Laravelのブレイドを使ってみよう
  6. マイグレーションの仕組みを解説
  7. シーディングを使ってみよう
  8. Eloquentの基本と使い方を徹底解説
  9. 画像アップロードを実装する方法 (now🐾)
  10. バリデーションを実装してみよう
  11. Laravelで認可処理を実装しよう

動画で学びたい方はこちらから!

シンボリックリンク設定

php artisan storage:link

画像アップロード実装

新規投稿

app/Http/Controllers/PostController.php

<?php

namespace App\Http\Controllers;

use App\Http\Requests\Post\StorePostRequest;
use App\Http\Requests\Post\UpdatePostRequest;
use App\Models\Post;
use Illuminate\Support\Facades\Storage;

class PostController extends Controller
{
    // ...省略...

    public function store(Request $request)
    {
        $path = Storage::disk('public')->putFile('posts', $request->file('image'));
        $post = new Post;
        $post->user_id = $request->user()->id;
        $post->image_path = Storage::url($path);
        $post->caption = $request->caption;
        $post->save();
        return redirect(route('dashboard'));
    }
  }

resources/views/posts/create.blade.php

<x-app-layout>
    <x-slot name="header">
        <h2 class="font-semibold text-xl text-gray-800 leading-tight">
            投稿作成
        </h2>
    </x-slot>
    <div class="max-w-5xl mx-auto">
        <form class="bg-white p-4 mt-8" enctype="multipart/form-data" action="/posts" method="POST">
            @csrf
            <x-input-label value="画像" class="mb-2"/>
            <x-file-input name="image"/>
            <x-input-label value="キャプション" class="mt-4 mb-2"/>
            <x-textarea name="caption" rows="8" placeholder="キャプションを入力してください..."/>
            <x-primary-button type="submit" class="mt-4">公開</x-primary-button>
        </form>
    </div>
</x-app-layout>

ユーザアイコン追加

app/Http/Controllers/ProfileController.php

<?php

namespace App\Http\Controllers;

use App\Http\Requests\ProfileUpdateRequest;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Storage;
use Illuminate\View\View;

class ProfileController extends Controller
{

    // ...省略...
  
    public function update(ProfileUpdateRequest $request): RedirectResponse
    {
        $request->user()->fill($request->validated());

        if ($request->user()->isDirty('email')) {
            $request->user()->email_verified_at = null;
        }

        $request->user()->save();
        if ($request->hasFile('icon')) {
            $path = Storage::disk('public')->putFile('icons', $request->file('icon'));
            $request->user()->icon = Storage::url($path);
            $request->user()->save();
        }

        return Redirect::route('profile.edit')->with('status', 'profile-updated');
    }

}

まとめ

以上、画像アップロードについてでした。

次回は、バリデーションについてです。

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

関連記事