Laravel學習筆記之Filesystem-從Dropbox中下載檔案到AWS S3

Laravel學習筆記之Filesystem-從Dropbox中下載檔案到AWS S3

說明:本文主要講述了Laravel的檔案系統Filesystem的小Demo,邏輯不復雜,主要就是把Dropbox上的一個檔案下載到本地local,和下載到AWS S3中。用到的檔案庫filesystem主要是:league/flysystem,Laravel中的illuminate/filesystem模組也僅僅是對該庫做了一個簡單的封裝。這個小Demo作為小練習玩玩,瞭解下Laravel的Filesystem。

備註:開發環境為Laravel5.2 MySQL5.7 PHP7

該兩個介面卡又依賴於對應的兩個SDK包,所以會同時安裝好Dropbox和AWS的SDK包。關於Adapter的概念可以檢視官網:Core Concepts,上面的文件是個好東西,值得研究研究。

Dropbox和AWS S3配置

Dropbox去Create Apps上新建個APP,然後拿到APP_SECRET和臨時的token:

同樣的,在AWS S3中新建一個Bucket後,拿到Key和Secret:

然後在配置檔案中config/filesystem.php中寫上磁碟配置:

'disks' => [
'local' => [
'driver' => 'local',
'root'   => storage_path('app'),
],
'public' => [
'driver'     => 'local',
'root'       => storage_path('app/public'),
'visibility' => 'public',
],
's3' => [
'driver' => 's3',
'key'    => env('S3_KEY'),
'secret' => env('S3_SECRET'),
'region' => env('S3_REGION'),
'bucket' => env('S3_BUCKET'),
],
'dropbox' => [
'driver'       => 'dropbox',
'access_token' => env('DROPBOX_TOKEN'),
'app_secret'   => env('DROPBOX_SECRET'),
],
],

同時,在.env檔案中寫上對應具體指。AWS S3中S3_REGION指該S3位置,我的是東京區,就是ap-northeast-1,同時新建的S3_BUCKET名稱是myrightcapitals3。

寫Dropbox驅動

由於illuminate/filesystem沒有dropbox驅動,需要自定義下:

php artisan make:provider DropboxProvider

在boot()中寫上名為dropbox

同時在config/app.php註冊下該DropboxProvider就行。

寫Artisan命令

php artisan make:console FileSystem/Dropbox --command=filesystem:dropbox

寫上命令的處理邏輯,很簡單的幾個函式呼叫,不詳述了:

namespace App\Console\Commands\FileSystem;
use Illuminate\Console\Command;
use Storage;
class Dropbox extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'filesystem:dropbox';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Download data from dropbox to local and aws s3';
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$content = Storage::disk('dropbox')->get('/AWS/myrightcapital.pem');
if (Storage::disk('public')->put('myrightcapital.pem', $content)) {
$this->info('Local download success.');
} else {
$this->info('Local download fail.');
}
if (Storage::disk('s3')->put('/AWS/myrightcapital.pem', $content)) {
$this->info('S3 download success.');
} else {
$this->error('S3 download fail');
}
}
}

執行命令php artisan filesystem:dropbox後,本地storage/app/public資料夾下就會下載一個myrightcapital.pem檔案,同時AWS S3上對應的Bucket裡也下載了該檔案。
執行命令後,顯示:

Dropbox上origin檔案myrightcapital.pem:

從Dropbox上下載到AWS S3上的myrightcapital.pem檔案:

It is working

該demo邏輯簡單,但很好玩。

One more thing

推薦一些我司在使用的支援敏捷開發軟體,很多東西挺自動化的,真的是DevOps開發運維自動化啊,有興趣的可以瞭解瞭解。首推Atlassian全家桶:Git管理軟體SourceTree(可以連Bitbucket、Github和Gitlab,Client APP的),Bitbucket程式碼儲存庫(類似Gitlab,搭建自己的私有庫,WEB的),JIRA(專案管理工具,WEB的),Confluence(強大的專案文件工具,WEB的),和Bamboo(自動build和deploy平臺,WEB的),Hipchat(強大的聊天和通知工具,QQ可不是適合工作中用的哦),這些軟體非常不錯,但最牛逼的是這些軟體是可以相互整合的,如一個issue通過SourceTree的一次commit push,Bamboo會自動build和deploy程式碼至伺服器,並且Hipchat收到push和deploy資訊,用起來會非常爽。還有日誌收集工具Logentry和錯誤通知工具Sentry,尤其Sentry對於收集Laravel程式的錯誤異常也很清晰,還有Runscope針對API測試和監測的軟體,這個大神器,實時監控線上API,有任何異常錯誤,Sentry會發郵通知我的啊,哈哈。提高生產力,生產工具很重要,不是靠堆人堆出來的啊

貼下平時工作中Hipchat收到的通知日常(QQ真的不是在工作中用的軟體啊),程式碼push/build/deploy都會收到通知,還可以跳轉到JIRA中或Bamboo中檢視具體issue資訊等等功能,是個團隊協作利器,推薦下:

總結:本文主要利用一個小demo瞭解下Laravel的Filesystem,實際上league/flysystem包和illuminate/filesystem包原始碼也值得研究研究玩一玩。

歡迎關注Laravel-China

RightCapital招聘Laravel DevOps