1. 程式人生 > >Laravel5.5整合七牛雲上傳、管理(刪除、查詢)

Laravel5.5整合七牛雲上傳、管理(刪除、查詢)

一、為什麼使用七牛雲端儲存

1、使用七牛頻寬和CDN,速度快,不佔用開發者伺服器。

2、支援圖片任意格式、任意解析度自動生成,可以用來做圖片伺服器。

3、小流量免費:儲存空間 10GB,每月下載流量 10GB,每月 PUT/DELETE 10萬次請求,每月 GET 100萬次請求。當專案發展大時,需要更大流量才需購買。適合網際網路創業者。

4、支援webp,畫質不變,圖片體積大幅度減小,特別適合作移動網際網路app的圖片伺服器。

二、註冊七牛雲並認證獲取免費空間

1. 登入七牛雲官網註冊賬號(已有直接登入);

2. 實名認證(先準備好清晰的人拿身份證正反面照片),大概3個工作日稽核通過;

三、申請物件儲存空間並獲取配置資訊

1. 申請物件儲存空間:

 2. 獲取使用七牛雲需要使用到的配置資訊

(1)祕鑰資訊:AccessKey、SecretKey

(2)空間資訊:bucket、domain

注意:

這裡的domain資訊是七牛雲給的測試域名資訊,如果要正式使用,點選融合CDN加速域名下的“立即繫結一個域名”,繫結的域名一定要是已備案域名。

配置要繫結域名的域名地址以及其他配置項,如果沒什麼特殊的需求,直接配置了地址後,預設其他配置就行。

配置完七牛雲的“繫結域名”,再到自己域名管理的雲平臺去解析這個配置域名到七牛雲指定的域名,具體參考七牛雲繫結域名後的提示。

四、Laravel中的程式碼操作 

 1. 安裝七牛雲擴充套件

composer require "qiniu/php-sdk"

2. 進入檔案 /config/filesystems.php ,在disks陣列中配置七牛雲配置資訊:

'disks' => [
        ……………… 省略以上 ……………………,

        'qiniu' => [
            'driver' => 'qiniu',
            'access_key' => Accesskey,    // 個人中心祕鑰管理獲取的Accesskey
            'secret_key' => SecretKey,    // 個人中心祕鑰管理獲取的SecretKey
            'bucket' => bucket,           // 空間名稱test
            'domain' => domain,           // 空間繫結的域名,帶上http 或者 https
        ],
    ],

3. 建立Laravel全域性公共七牛雲檔案管理函式(上傳、查詢單檔案、查詢檔案列表、刪除檔案、下載檔案)

(1)在/app資料夾下建立Helper資料夾,用於放置專案用到的所有全域性函式檔案;

(2)在 /app/Helper資料夾下建立qiniu.php檔案,該檔案用於管理所有七牛雲操作函式;

(3)開啟根目錄下的composer.json檔案,配置autoload引數,新增如下自動載入:

// 注意:在composer.json檔案中配置每個陣列結構的最後一個引數後面都不要加 “,”

"autoload": {

    ………… 省略以上 …………,

    "files": [
        "app/Helpers/qiniu.php"
    ]    
},

(4)執行命令,讓全域性函式檔案生效

composer dump-auto

 (5)完成qiniu.php的操作函式

<?php
    use Qiniu\Auth;
    use Qiniu\Storage\UploadManager;
    use Qiniu\Storage\BucketManager;

    /*
     *  構建鑑權物件
     */
    function qiniuConfig()
    {
        // 獲取七牛雲配置資訊
        $config = Config::get('filesystems.disks.qiniu');
        // 構建鑑權物件
        $auth = new Auth($config['access_key'], $config['secret_key']);

        return $auth;
    }

    /*
     *  上傳檔案
     *  引數$file:上傳檔案的資訊,如 $request->file('image')
     */
    function qiniuUpload($file)
    {
        // 構建鑑權物件
        $auth = qiniuConfig();
        // 生成上傳 Token
        $token = $auth->uploadToken($config['bucket']);
        //獲取檔案的絕對路徑,但是獲取到的在本地不能開啟
        $filePath = $file->getRealPath();
        //獲取檔案的副檔名
        $ext = $file->getClientOriginalExtension();
        // 新檔名
        $key = date('Y-m-d-H-i-s') . '-' . uniqid() .'.'. $ext;
        // 初始化 UploadManager 物件並進行檔案的上傳。
        $uploadMgr = new UploadManager();
        // 呼叫 UploadManager 的 putFile 方法進行檔案的上傳。
        $uploadMgr->putFile($token, $key, $filePath);
        // 返回上傳到雲純屬的關鍵字資訊
        return $key;
    }

    /*
     *  刪除檔案  
     *  引數:$key —— 在七牛雲上儲存的檔案關鍵字,如:2018-11-16-12-14-03-5bee440ba7e09.png
     */
    function qiniuDelete($key)
    {
        // 構建鑑權物件
        $auth = qiniuConfig();
        // 構建 UploadManager 物件
        $bucketMgr = new BucketManager($auth);
        // 刪除
        $err = $bucketMgr->delete($config['bucket'], $key);

        if ($err !== null) {
            \Log::alert('deleteImgError', $err);
        }
    }

    /*
     *  獲取七牛雲上的檔案列表
     *  注意:這裡預設是獲取前1000個檔案,如果需要更多操作,可以自己查Qiniu\Storage\BucketManager中的listFiles方法進行修改。
     */
    function qiniuList()
    {
        // 構建鑑權物件
        $auth = qiniuConfig();
        // 構建 UploadManager 物件
        $bucketMgr = new BucketManager($auth);
        // 獲取列表資訊
        list($ret, $err) = $bucketMgr->listFiles($config['bucket']);

        // 判斷結果
        if ($err !== null) {
            return ["err"=>1, "msg"=>$err, "data"=>""];
        } else {
            //返回檔案列表完整資訊
            return $ret;
        }
    }

    /*
     *  獲取指定檔案的元資訊,包括檔案大小等
     *  引數$key:指定檔案儲存在七牛雲上的關鍵字,如:2018-11-16-12-14-03-5bee440ba7e09.png
     */
    function qiniuStat($key)
    {
        // 構建鑑權物件
        $auth = qiniuConfig();
        // 構建 UploadManager 物件
        $bucketMgr = new BucketManager($auth);
        // 獲取列表資訊
        return $bucketMgr->stat($config['bucket'], $key);
    }

    /*
     *  下載指定key值的七牛雲檔案
     *  引數$key:指定檔案儲存在七牛雲上的關鍵字,如:2018-11-16-12-14-03-5bee440ba7e09.png
     */
    function qiniuDownload($key)
    {
        // 獲取指定檔案的大小
        $fileSize = qiniuStat($key)[0]['fsize'];
        // 獲取指定key的檔案完整路徑
        $filePath = Config::get('filesystems.disks.qiniu.domain'). "/" . $key;
        // 開啟瀏覽器的快取區
        ob_start();
        // 構建下載header資訊,開始下載
        header("Content-type: application/octet-stream");
        header("Accept-Ranges: bytes");
        header("Content-Disposition:attachment;filename={$key}");
        header("Accept-Length:{$fileSize}");
        readfile($filePath);
    }

(6)控制器中的程式碼操作示例:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class TestController extends Controller
{
    /*
     *  上傳檔案
     */
    public function uploadFile(Request $request)
    {
        // 判斷檔案是否上傳以及獲取的檔案是否是個有效的例項物件
        if ($request->hasFile('image') && $request->file('image')->isValid()) {
            return qiniuUpload($request->file('image'));
        }
        
        return "請上傳檔案!";
    }

    /*
     *  刪除檔案
     */
    public function deleteFile(Request $request)
    {
        $data = $request->validate([
            'key' => 'required'
        ]);
        
        qiniuDelete($data['key']);
    }

    /*
     * 下載檔案
     */
    public function downloadFile(Request $request)
    {
        $data = $request->validate([
            'key' => 'required'
        ]);
        
        return qiniuDownload($data['key']);
    }

    /*
     *  獲取檔案列表
     */
    public function listFile()
    {
        return qiniuList();
    }

}

(7)在檔案中顯示七牛雲的檔案

  因為我們儲存在資料庫的七牛雲檔案資訊是“key”值,所以在模版中顯示七牛雲檔案時,需要用配置資訊domain的值拼接模版獲取到檔案    key值,組裝檔案完整訪問路徑:

// 獲取原圖
<img src="{{ Config::get('filesystems.disks.qiniu.domain'). '/'. $info->image }}" width="100">

/*
 *   獲取大小壓縮的圖片
 *   加引數:?imageView/1/w/圖片寬度/h/圖片高度 ,可以只傳寬度或者高度資料
 */
<img src="{{ Config::get('filesystems.disks.qiniu.domain'). '/'. $info->image }}?imageView/1/w/200/h/100">

/*
 *  獲取質量壓縮的圖片
 *  format-新圖片格式(只有jpg格式圖片才能壓縮)
 *  quality-新圖片質量
 *  加引數:?imageMogr2/format/jpg/quality/質量大小
 */
<img src="{{ Config::get('filesystems.disks.qiniu.domain'). '/'. $info->image }}?imageMogr2/format/jpg/quality/40">

五、解決七牛雲構建鑑權物件Auth類與Laravel擴充套件使用者註冊登入認證Auth類衝突

除了以上七牛雲給的官方SDK,還可以安裝 “超哥” 寫的擴充套件 “overtrue/laravel-filesystem-qiniu”,使用這個擴充套件,極大地簡化了程式碼,具體操作如下:

1. 安裝擴充套件

composer require "overtrue/laravel-filesystem-qiniu"

2. 配置 /config/app.php 中的providers引數,新增如下程式碼:          

'providers' => [
    ………… 省略以上 ……………,

    Overtrue\LaravelFilesystem\Qiniu\QiniuStorageServiceProvider::class,
]

3. 再和第四大步一樣配置七牛雲的配置資訊,並建立公共函式檔案qiniuOver.php。

4. 完成qiniuOver.php操作函式:

<?php

    // 不需要引入任何檔案,但只能操作已配置的一個七牛雲空間
    
    /*
     *  上傳檔案
     */
    function qiniuUpload($file)
    {
        //獲取檔案的絕對路徑,但是獲取到的在本地不能開啟
        $path = $file->getRealPath();
        //獲取檔案的副檔名
        $ext = $file->getClientOriginalExtension();
        // 新檔名(七牛雲上的檔案關鍵字)
        $key = date('Y-m-d-H-i-s') . '-' . uniqid() .'.'. $ext;
        // 上傳檔案
        Storage::disk('qiniu')->put($key, file_get_contents($path));

        return $key;
    }

    /*
     *  刪除檔案  
     */
    function qiniuDelete($key)
    {
        Storage::disk('qiniu')->delete($key);
    }

    /*
     *  獲取七牛雲上的檔案列表
     */
    function qiniuList()
    {
        return Storage::disk('qiniu')->listContents();
    }

    /*
     *  獲取指定檔案的大小資訊
     */
    function qiniuSize($key)
    {
        return Storage::disk('qiniu')->getSize($key);
    }

    /*
     *  下載指定key值的七牛雲檔案
     */
    function qiniuDownload($key)
    {
        // 獲取指定檔案的大小
        $fileSize = qiniuSize($key);
        // 獲取指定key的檔案完整路徑
        $filePath = Config::get('filesystems.disks.qiniu.domain'). "/" . $key;
        // 開啟瀏覽器的快取區
        ob_start();
        // 構建下載header資訊,開始下載
        header("Content-type: application/octet-stream");
        header("Accept-Ranges: bytes");
        header("Content-Disposition:attachment;filename={$key}");
        header("Accept-Length:{$fileSize}");
        readfile($filePath);
    }

六、參考文件