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="">

 

這樣就完成上傳檔案以及取得檔案路徑的方法。