laravel之标准上传图片

前面也写过七牛上传图片的方法,不过在学习laravel书的时候看到了更加规范,更加好的上传图片类,因此想记载下来,供本身学习,也能够总结一点本身的心得。php

上传图片,后台的总体思路是这样子的。前端

  1. 获取前端传过来的图片。
  2. 对图片进行大小范围验证,进行图片后缀名验证,进行是否为图片的验证。
  3. 定义存储路径以及图片名(这里应该规范)
  4. 储存在规定的储存路径中,存储到数据库, 或者返回给前端。

若是涉及到了图片太大,对图片进行了裁剪,用到了一个包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

相关文章
相关标签/搜索