laravel之標準上傳圖片

劍歌丶君發表於2018-05-13

前面也寫過七牛上傳圖片的方法,不過在學習laravel書的時候看到了更加規範,更加好的上傳圖片類,所以想記載下來,供自己學習,也可以總結一點自己的心得。

上傳圖片,後臺的整體思路是這樣子的。

  1. 獲取前端傳過來的圖片。
  2. 對圖片進行大小範圍驗證,進行圖片字尾名驗證,進行是否為圖片的驗證。
  3. 定義儲存路徑以及圖片名(這裡應該規範)
  4. 儲存在規定的儲存路徑中,儲存到資料庫, 或者返回給前端。

如果涉及到了圖片太大,對圖片進行了裁剪,用到了一個包

//安裝包
$ 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封裝好的方法。 如果是原生方法,封裝思路基本也是一樣的。到此為止...

相關文章