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