Laravelの画像アップロードを徹底解説
本章では、Laravelで画像アップロードができるように設定し、アップロード後のパスをデータベースに保存する方法について学んでいきます。
SNSアプリの以下の機能を作成します。
- プロフィールアイコン画像変更
- 新規投稿画像作成
チュートリアルの全体像
本チュートリアルを通じて学べる内容は以下のようになります。
- Laravelの開発環境セットアップ
- Laravel Breezeで認証機能を導入
- Laravelのルーティングを徹底解説
- Laravelのコントーラーを徹底解説
- Laravelのブレイドを使ってみよう
- マイグレーションの仕組みを解説
- シーディングを使ってみよう
- Eloquentの基本と使い方を徹底解説
- 画像アップロードを実装する方法 (now🐾)
- バリデーションを実装してみよう
- 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');
}
}
まとめ
以上、画像アップロードについてでした。
次回は、バリデーションについてです。
この記事へのコメントはありません。