Laravel 在上傳檔案上也提供了很方便的方法,首先準備兩個 route,一個是選取檔案的,一個則是處理上傳檔案的內容。
Route::get('flight/file', [FlightController::class, 'file'])->name("flight.file");
Route::post('flight/upload', [FlightController::class, 'upload'])->name("flight.upload");
接著我在 file.blade 那個檔案建立一個上傳的表單:
controller 部分:
public function file(){
return view('file';
}
blade 部分:
<form action="{{route('flight.upload')}}" method="post" enctype="multipart/form-data">
@csrf
<div class="mb-2">
<input type="file" name="photo" accept="image/*">
</div>
<button class="btn btn-info" type="submit">Save Photo</button>
</form>
action 那邊帶的就是在 route 設定時的 name,而表單記得要設定 enctype="multipart/form-data" 還有 @csrf 不然會無法上傳。
接著處理上傳檔案的部份:
public function upload(Request $request){
//自訂檔案名稱
$imageName = time().'.'.$request->photo->extension();
//把檔案存到公開的資料夾
$request->photo->move(public_path('images'), $imageName);
//回到傳送資料來的頁面
return back();
}
也可以驗證傳送過來的檔案資訊:
Validator::make($request->all(), [ 'photo' => 'required|image', ])->validate();
要驗證的話要 use 這段:
use Illuminate\Support\Facades\Validator;
也可以用 $request->hasFile('photo') 檢查有夾帶檔案才做之後的事,完整的 code 如下:
public function upload(Request $request){
Validator::make($request->all(), [
'photo' => 'required|image',
])->validate();
if($request->hasFile('photo')){
$imageName = time().'.'.$request->photo->extension();
$request->photo->move(public_path('images'), $imageName);
}
return back();
}
上面那邊上傳檔案後,會把檔案存到 /public/images 下面,假設這次存的檔名為 01.jpg,那我們要在頁面上讀取的話則可以使用 asset() 來讀取。
<img src="{{asset('images/01.jpg')}}" alt="">
這樣就完成上傳檔案以及取得檔案路徑的方法。