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

相關文章
相關標籤/搜索