前面也寫過七牛上傳圖片的方法,不過在學習
laravel
書的時候看到了更加規範,更加好的上傳圖片類,所以想記載下來,供自己學習,也可以總結一點自己的心得。
上傳圖片,後臺的整體思路是這樣子的。
- 獲取前端傳過來的圖片。
- 對圖片進行大小範圍驗證,進行圖片字尾名驗證,進行是否為圖片的驗證。
- 定義儲存路徑以及圖片名(這裡應該規範)
- 儲存在規定的儲存路徑中,儲存到資料庫, 或者返回給前端。
如果涉及到了圖片太大,對圖片進行了裁剪,用到了一個包
//安裝包
$ composer require intervention/image
//獲取配置資訊
$ php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravel5"
複製程式碼
所以這裡先建立一個上傳圖片類:
app/Handles/ImageUploadHandle.php
<?php
namespace App\Handles
use Image;
class ImageUploadHandles {
//定義一個允許的字尾名屬性
protected $allow_ext = ['jpg', 'jpeg', 'png', 'gif'];
public function save($file, $folder, $file_prefix, max_width) {
//進行字尾名的驗證,如果沒有那麼就預設為png
$extension = $file->strtolower(getClientOriginalExtension()) ?: 'png'
if(! in_array($extension, $this->allow_etc)) {
return false;
}
//定義儲存路徑,資料夾切割能讓查詢效率更高
$folder_name = "uploads/images/" . $folder.date("Ym/d", time());
$upload_path = public_path() . '/' . $folder_name;
//定義檔名
$file_name = $file_prefix . "_" . time() . "_" . str_random(10).".". $extension;
//將圖片移動到目標儲存位置
$file->move($upload_path, $file_name);
//如果限制了圖片寬度,就進行裁剪
if ($max_width && $extension != 'gif') {
// 此類封裝的函式, 用於裁剪圖片
$this->reduceSize($upload_path . "/" . $file_name);
}
//返回圖片已經儲存的路徑
return ['path' => config('app_url') . "$folder_name/$file_name"];
}
public function reduceSize($file_name, $max_width) {
//先例項化,引數是圖片物理路徑
$image = Image::make($file_name);
//將圖片的大小進行調整
$image->resize($max_width, null, function($constraint) {
//設定寬度 $max_width, 高度等比例雙方縮放
$constraint->aspectRatio();
//防止裁圖時圖片尺寸變大
$constraint->upsize();
});
//對圖片進行儲存
$image->save();
}
}
複製程式碼
用一個更新資料上傳頭像進行舉例
.
use App\Handlers\ImageUploadHandler;
.
.
.
public function update(Request $request, ImageUploadHandle $upload, User $user) {
//獲取所有表單資訊並賦值給 $data
$data = $request->all();
//如果上傳了圖片
if ($request->avatar) {
//呼叫上傳圖片類裡的save方法,獲取儲存的圖片路徑
$image = $upload->save($request->avatar, 'avatars', $user->id, 362);
//將圖片路徑賦值 $data 裡
$data['avatar'] = $image['path'];
}
//更新操作
$user->update($data);
//跳轉
return redirect()->route('users.show', $user->id)->with('success','個人資料更新成功!');
}
複製程式碼
基本的思路就是這樣,裡面用到了laravel
封裝好的方法。 如果是原生方法,封裝思路基本也是一樣的。到此為止...