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="">
這樣就完成上傳檔案以及取得檔案路徑的方法。