在一個項目中上傳文件是必不可少的一個基礎功能。那么我們用 laravel 怎么上傳圖片呢?
比如我們要讓用戶上傳自己的頭像。
首先在要提交的表單里面添加上上傳文件的代碼:
<input type="file" name="avatar">
然后在表單屬性里一定要添加 enctype="multipart/form-data" 屬性才行,否則圖片是提交不上去的
<form action="{{ route('users.update', $user->id) }}" method="POST" accept-charset="UTF-8" enctype="multipart/form-data">
當然在后台接受數據之前肯定要先進行驗證用戶上傳的圖片是否合法。我們需要在表單上傳請求類中添加一下圖片驗證規則
<php use Illuminate\Foundation\Http\FormRequest; class UserRequest extends FormRequest { public function authorize() { return true; } public function rules() { return [ 'avatar' => 'mimes:jpeg,bmp,png,gif', ]; } public function messages() { return [ 'avatar.mimes' =>'頭像必須是 jpeg, bmp, png, gif 格式的圖片', ]; } }
圖片驗證規則有很多,甚至我們可以驗證圖片的分辨率大小:
.
.
.
'avatar' => 'mimes:jpeg,bmp,png,gif|dimensions:min_width=208,min_height=208',
.
.
.
我們用了 dimensions 來限制圖片的寬和高必須要在 208px 以上
然后我們就能夠通過 (請求對象)Request 來獲取文件啦,通常有兩種方式來獲取文件:
// 第一種方法
$file = $request->file('avatar');
// 第二種方法,可讀性更高
$file = $request->avatar;
既然我們拿到了上傳的文件,那么接下來就是要保存到我們指定的位置啦!
我們先生成保存圖片的路徑
//值如:uploads/images/avatars/201709/21/
$folder_name = "uploads/images/avatars/" . date("Ym/d", time());
通常我們需要按照時間日期來進行分割文件夾,這樣能使我們的查找效率更高。
那么我們的文件儲存物理路徑則為:
$upload_path = public_path() . '/' . $folder_name;
public_path() 獲取的是 public 文件夾的物理路徑。
接下來就是拼接要生成的文件名了
// 獲取文件的后綴名,因圖片從剪貼板里黏貼時后綴名為空,所以此處確保后綴一直存在
$extension = strtolower($file->getClientOriginalExtension()) ?: 'png';
// 拼接文件名,加前綴是為了增加辨析度,前綴可以是相關數據模型的 ID
// 值如:1_1493521050_7BVc9v9ujP.png
$filename = $file_prefix . '_' . time() . '_' . Str::random(10) . '.' . $extension;
最終再用 move 方法移動就行啦!
// 將圖片移動到我們的目標存儲路徑中
$file->move($upload_path, $filename);
//此時文件的路徑則為
'path' => config('app.url') . "/$folder_name/$filename"
不出意外,此時已經保存在了我們指定的位置,接下來將路徑保存到數據庫中就行了
$user->avatar = $folder_name . '/' . $filename;
$user->save();
當然想要用此方法保存那我們要先在 User 模型中將 avatar 字段添加到白名單才行。
//將 avatar 添加到 fillable 數組中就行了
protected $fillable = [
'name', 'email', 'password', 'avatar',
];
我們在保存文件路徑的時候,如果該文件在本地則保存相對路徑,比如 uploads/images/avatars/201709/21/ 就行了,如果文件不再本地則需要保存全路徑啦。
到此我們圖片上傳就完成啦


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//上傳圖片
public function uploadImage(Request $request)
{
$file = $request->file('file');
//值例如 upload/images/avatars/202123/21
$folder_name = "upload/images/article/".date('Ym/d/',time());
$upload_path = public_path() . "/" . $folder_name;
$extension = strtolower($file->getClientOriginalExtension()) ?: 'png';
$filename = time().'.'. $extension;
//將圖片移動到我們目標存儲路徑中
$file->move($upload_path , $filename);
return "http://yh.lartzl.com/".$folder_name.$filename;
}
---------------------------------------------------------------------------------------------------------------------------
laravel 是無法訪問
storage/app/public/images 里面的圖片的
首先
laravel建立storage目錄文件到public的軟連接
執行命令:php artisan storage:link
命令執行完畢后,就會在項目里多出一個 public/storage,
這個 storage 就是一個軟鏈接,它指向 storage/app/public 目錄。
public/storage(軟連接) → storage/app/public
然后就可以用地址直接訪問public里面的照片了! 必須創建軟連接

//上傳圖片
public function uploadImage(Request $request)
{
$path = $request->file('file')->store('avatars/'.date('Y-m-d'), 'public');
return $path;
}



