前面也写过七牛上传图片的方法,不过在学习
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