前面也寫過七牛上傳圖片的方法,不過在學習
laravel
書的時候看到了更加規範,更加好的上傳圖片類,因此想記載下來,供本身學習,也能夠總結一點本身的心得。php
上傳圖片,後臺的總體思路是這樣子的。前端
若是涉及到了圖片太大,對圖片進行了裁剪,用到了一個包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
封裝好的方法。 若是是原生方法,封裝思路基本也是同樣的。到此爲止...bash