PHP 文件上傳七牛雲


PHP

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

 

一.  序言

 

這幾天在laravel 框架上使用qiniu,  發現這類教程有些少, 所以就把自己的經驗寫下來, 以供大家參考一下.

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

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

 

二.  前文

 

環境: php:7.0.12, laravel.

 

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

 

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);

       }

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM