[Laravel]上傳檔案

Kunyu
Mar 8, 2024
Photo by Clay Banks on Unsplash

Laravel 不只是 Route + MVC 做得很好,上傳檔案也是非常優雅,相信寫過 PHP 的開發者都能馬上體會到,這篇文章內容以上傳使用者頭像為例,首先建立兩個 route,一個用來讓使用者點選上傳的表單介面,另一個則是用來儲存使用者頭像。

Route::get('/manage-avatar', [UserController::class, 'showAvatarForm']);
Route::post('/manage-avatar', [UserController::class, 'storeAvatar']);

接著在前端可以用許多不同的方式來跟後端溝通上傳圖片,這裡使用傳統表單並且設置 enctype= multipart/form-data,這是最簡單的方式,相當適合新手。(備註: 預設情況下 Laravel 要使用 @csrf 才可以成功把表單送出。)


<div class="container container--narrow py-md-5">
<h2 class="text-conter mb-3">上傳新頭像</h2>
<form action="/manage-avatar" method="POST" enctype="multipart/form-data">
@csrf
<div class="mb-3">
<input type="file" name="avatar" required>
@error('avatar')
<p class="alert small alert-danger shadow-sm">{{$message}}</p>
@enderror
</div>
<button class="btn btn-primary">儲存</button>
</form>
</div>

如果你是 PHP 開發者,在儲存上傳檔案的時候就會開始設置取得上傳暫存檔案,然後存入想放的路徑,但是 Laravel 不需要,你只需要在 Controllers 使用 store,就能夠把圖片存入 storage/app/public/,超級輕鬆。

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
public function storeAvatar(Request $request)
{
$request->file('avatar')->store('public/avatars');
return '上傳完成。';
}
}

如果上傳的圖片需要讓人存取,可以執行 artisan 指令讓 storage/app/public/ 跟 public/storage 軟連結在一起。(備註:這麼做之前還要資安以及權限考量)

php artisan storage:link

最後一個是可接受上傳檔案的大小,這個設定就跟 Laravel 無關了,而是要去 php.ini 進行設定,預設情況下是最大可接受 2M,透過以下設定放大到 8M。

upload_max_filesize= 8M

本篇沒有提到上傳驗證、靜態資源(圖片)讀取權限以及資料庫紀錄檔案路徑等議題,讀者可以再自行研究^^

--

--