在傳統的圖片上傳中,相比於先上傳到伺服器,再從伺服器傳到雲端儲存來說,少了一步轉發。從架構上來說,原來的上傳都統一走網站伺服器,上傳量過大時,瓶頸在網站伺服器,可能需要擴容網站伺服器。採用表單上傳後,上傳都是直接從客戶端傳送到雲端儲存。上傳量過大時,壓力都在雲端儲存上,由雲端儲存來保障服務質量。
Github: laravel-uploader
功能
- 圖片上傳預覽
- 上傳進度顯示
- 圖片格式限制
- 上傳數量限制
- 精美的UI
- 支援直傳到雲端儲存
安裝
composer require sunnyshift/laravel-uploader
新增服務提供者
SunnyShift\Uploader\UploaderServiceProvider::class,
生成資原始檔
php artisan vendor:publish --provider=SunnyShift\\LaravelUploader\\UploadServiceProvider
使用
-
新增上傳元件到頁面
@uploader(['name' => 'avatar', 'max' => 3, 'accept' => 'jpg,png,gif'])
- 新增資原始檔
@uploader('assets')
該元件依賴
jQuery
,所以在引入的資原始檔的時候必須先引入jQuery
直傳到雲端儲存
目前支援的第三方雲儲存:本地(local)
百度雲(bos)
騰訊雲(cos)
阿里雲(oss)
七牛雲(qiniu)
新浪雲(scs)
又拍雲(upyun)
其中的本地不算雲端儲存,只是標識仍舊支援本地磁碟儲存。
- 青雲的鑑權方式比較奇特所以暫時無法支援
- UCloud的鑑權方式太複雜暫時不打算支援
1.配置
百度雲:
'disks' => [
'bos' => [
'driver' => 'bos',
'access_key_id' => 'xxxxxxxxxx',
'access_key_secret' => 'xxxxxxxxxx',
'bucket' => 'xxx',
'region' => 'gz' //改成儲存桶相應地域
],
]
騰訊雲:
'cos' => [
'driver' => 'cos',
'app_id' => '123456789',
'secret_id' => 'xxxxxxxxxxx',
'secret_key' => 'xxxxxxxxxxx',
'bucket' => 'xxxxxxxxx',
'region' => 'sh' //改成儲存桶相應地域
]
注意,騰訊雲端儲存的時候不是以資源的訪問路徑存的,會加上appid和儲存桶的引數。主要是騰訊雲上傳後沒有返回資源的相對路徑,而且這樣的儲存方式也是官方推崇的。
阿里雲:
'oss' => [
'driver' => 'oss',
'access_key' => 'xxxxxxxxxx',
'secret_key' => 'xxxxxxxxxx',
'bucket' => 'xxxxx',
],
七牛雲:
'qiniu' => [
'driver' => 'qiniu',
'access_key' => 'xxxxxxxxxxxxxxxxxx',
'secret_key' => 'xxxxxxxxxxxxxxxxxx',
'bucket' => 'xxxxxxxxxxxxxxxxxx',
'domain' => 'xxxxxxxxxxx'
],
新浪雲:
'scs' => [
'driver' => 'scs',
'access_key' => 'xxxxxx',
'secret_key' => 'xxxxxxx',
'bucket' => 'xxxxxxxx'
]
又拍雲:
'upyun' => [
'driver' => 'upyun',
'operator' => 'xxxxx',
'password' => 'xxxxxx',
'bucket' => 'xxxxxx',
'domain' => 'xxxxxx',
'form_api_secret' => 'xxxxx',
]
2.設定雲儲存
FILESYSTEM_DRIVER=qiniu
擴充套件
當然,你也可以擴充支援的雲端儲存,很簡單:
1.新增驅動
<?php
use SunnyShift\Uploader\Contracts\UploaderContract;
class MyStorage implements UploaderContract {
/**
* 請求url
* @return string
*/
public function url() : string;
/**
* 請求頭
* @return array
*/
public function header() : array;
/**
* 請求體
* @return array
*/
public function params() : array;
/**
* 檔案表單名
* @return string
*/
public function fileName() : string;
/**
* 響應的url的鍵.
* @return string
*/
public function responseKey() : string;
}
2.擴充
Uploader::extend('mystorage', function($app) {
return new MyStorage();
});
3.使用
FILESYSTEM_DRIVER=mystorage
或者
Uploader::setAdapter('mystorage');
說明
自帶的上傳元件UI是按照WEUI的上傳功能設計的,可能不能滿足您業務的需求,那麼您可以自行構建UI後再把一些請求引數傳到前臺。也很簡單:
$data = Uploader::build($jsoned = true);
其中data
包含實現SunnyShift\Uploader\Contracts\UploaderContract
的所有引數,可以根據具體業務使用。
Github: laravel-uploader
微信與訂閱號,歡迎關注 :smile: