PHP 文件上傳七牛雲

PHPphp

  之Laravel 使用qiniu/php-sdk, itbdw/laravel-storage-qiniu, 組件上傳文件到七牛雲.laravel

 

一.  序言數據庫

 

這幾天在laravel 框架上使用qiniu,  發現這類教程有些少, 因此就把本身的經驗寫下來, 以供你們參考一下.數組

在這裏有兩個組件可使用, 一個是PHP 通用的qiniu/php-sdk, 只要使用PHP,就可使用的通用組件,app

而itbdw/laravel-storage-qiniu, 是其做者根據laravel 的特性優化qiniu/php-sdk 組件從而方便在laravel 上使用的文件上傳組件. 感謝他們!composer

 

二.  前文框架

 

環境: php:7.0.12, laravel.dom

 

1) 首先, 創建一個小模塊.ide

 

a) 連接地址函數

admin/test/fileupload

 

b) 路由

Route::group(['prefix' => 'admin', 'namespace' => 'Admin'], function() {

  Route::get('test/fileupload', "TestController@fileUpload");

  Route::post('test/upload', "TestController@upload");

});

 

c) 控制器展示視圖

  TestController/fileUpload

 

d) 視圖

admin/test/fileupload

 

  視圖只須要一個表單, 加上input:file, 便可.

 

Tip: 要想上傳文件, 須在更改form 表單編碼, 這裏介紹enctype. 文件上傳時必須使用multipart/form-data.

<form action="{{url('admin/test/upload')}}" method="post" enctype="multipart/form-data">

 

 

 

 

 

. enctype: 規定在發送表單數據以前如何對其進行編碼。有三種設置類型

默認爲application/x-www-form-urlencoded:發送前編碼全部字符

. multipart/form-data:不對字符編碼,包含文件上傳控件的表單時,必須使用該值

. text/plain:空格轉換爲 "+" 加號,但不對特殊字符編碼。

 

e) 處理.

 

在這裏選一張圖片點擊上傳, form 表單提交到TestController/upload 控制器. dd 打印一下.

 

 

 

 

 

  看到上傳文件信息, 如今開始上傳七牛雲操做.

 

三. 安裝

 

1) composer 下載qiniu/php-sdk, itbdw/laravel-storage-qiniu 兩個組件.

 

這兩個組件均可以在https://packagist.org/ 上搜到. 其實各個組件也都自帶教程, 只是不針對.

 

2) 打開命令行cd 到laravel 文件夾下

 

cd ../laravel

(這裏cd 你本身的地址)

 

3) 安裝itbdw/laravel-storage-qiniu, qiniu/php-sdk

 

composer require itbdw/laravel-storage-qiniu

 

Tip: 這時候安裝過程會出現一個錯誤.

 

 

 

doctrine / instantiator的安裝請求(鎖定在1.1.0) - >由doctrine / instantiator能夠知足[1.1.0], 這個組件須要PHP ^7.1 版本, 因此個人版本不知足要求. 這時候安裝doctrine/instantiator 便可, 在Packagist 上也能搜到, 做用是: 用於在不調用構造函數的狀況下實例化PHP中的對象.

 

composer require doctrine/instantiator

 

 

  會發現他給你倒退版本. 這時候再次安裝itbdw/laravel-storage-qiniu 組件便可.

 

composer require itbdw/laravel-storage-qiniu

 

 

  安裝成功後, 會自動安裝qiniu/php-sdk, 發現laravel/vendor 下有了itbdw, qiniu 兩個文件夾.

 

 

 

四. 使用

 

a) itbdw/laravel-storage-qiniu

 

1. 在config/app.php裏面的providers數組,加上一行

itbdw\QiniuStorage\QiniuFilesystemServiceProvider::class,

 

 

Tip: 這就至關於註冊中間件同樣, 告訴框架, 我在提供方里註冊了一個新組件.

 

2. config/filesystem.php的裏面disks數組加上:

 

'disks' => [

 

        // 若是有多個 bucket,增長相似配置便可

        'qiniu' => [

            'driver' => 'qiniu',

            'domain' => 'https://www.example.com',   //你的七牛域名,支持 http 和 https,也能夠不帶協議,默認 http

            'access_key' => '',                       //AccessKey

            'secret_key' => '',                       //SecretKey

            'bucket'     => '',                      //Bucket名字

        ],

       

        'qiniu_private' => [

            'driver' => 'qiniu',

            'domain' => 'https://www.example.com',    //你的七牛域名,支持 http 和 https,也能夠不帶協議,默認 http

            'access_key'    => '',                         //AccessKey

            'secret_key' => '',                            //SecretKey

            'bucket' => 'qiniu_private',                 //Bucket名字

        ],

       

        ...

],

 

Tip: disks 數組裏面有兩個數組, 看名字也知道, 一個爲正常狀況下使用, 一個是私有的. 我只添加了一個通用的, 也就是第一個, 如有要保密的, 可用第二個.

 

. 在這裏講講這幾個參數.

 

'driver'  # 就不講了, 默認qiniu

 

'domain' => 'https://www.example.com',  

// 你的七牛域名,(支持 http 和 https,也能夠不帶協議,默認 http)

 

 

'access_key'   # 公鑰

'secret_key'   # 密鑰

 

 

 

'bucket'     # bucket 就是你空間的名字

 

  

3. itbdw/laravel-storage-qiniu 的使用不用引入命名空間, 直接使用. 其readme 中也有介紹方法, 兩種, 可是能夠結合用.

 

代碼:

$disk     = \Storage::disk('qiniu');             // 使用七牛雲上傳 

$time     = date('Y/m/d'); 

$filename = $disk->put($time, $request->file('file')); // 上傳 

$img_url  = $disk->downloadUrl($filename);  // 獲取下載連接

 

 

 

打印一下獲取的下載地址, 能看到說明已經上傳成功了.

  

 

  以你的域名和時間爲前綴的圖片地址就生成了, 這樣你就能夠以字符串的形式寫入數據庫, 引用的時候直接<img src=」」, 便可.

 

4. qiniu/php-sdk

 

. 引入

 

  在控制器中, use

 

use Qiniu\Storage\UploadManager;

use Qiniu\Auth;

 

 

在方法中

 

 

$file = $request->file('file');  

// laravel 獲取文件的信息, 如果日常PHP, 用$_FILES['file'].

      

       $tmpPath  = $file->getRealPath();    // 獲取圖片在本地絕對路徑

       $ext      = $file->getClientOriginalExtension();   

// 獲取後綴名

      

$fileName = time() . rand(1000, 10000) . '.' . $ext; 

// 拼接文件名

      

      

       $accessKey = 'AccessKey';                        # 公鑰

       $secretKey = 'SecretKey';                                     # 私鑰

        $upManager = new UploadManager();

        $auth    = new Auth($accessKey, $secretKey);

        $token = $auth->uploadToken($bucketName);    # 上傳空間名稱

        list($ret, $error) = $upManager->putFile($token, $fileName, $tmpPath);

 

Tip: 文檔中用的是put, 但我試過用put 不成功, 改成putFile.

 

// 把參數依次傳入, 上傳後打印一下, 看到效果即成功.

      

       if ($error !== null) {

          dd($error);

       } else {

          dd($ret);

       }

 

相關文章
相關標籤/搜索