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