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

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

備註:開發環境爲Laravel5.2+MySQL5.7+PHP7,該環境也是咱們公司項目環境,使用起來還不錯。Dropbox是個相似百度雲的存儲軟件,AWS S3是個相似阿里雲RDS的雲數據庫。laravel

安裝Dropbox Adapter和AWS Adapter

league/flysystem官網上已經提供了兩個Adapter的安裝了:Aws S3 Adapter - SDK V3Dropbox Adapter,Artisan命令爲:數據庫

composer require league/flysystem-aws-s3-v3
composer require league/flysystem-dropbox

該兩個適配器又依賴於對應的兩個SDK包,因此會同時安裝好Dropbox和AWS的SDK包。關於Adapter的概念能夠查看官網:Core Concepts,上面的文檔是個好東西,值得研究研究。api

Dropbox和AWS S3配置

Dropbox去Create Apps上新建個APP,而後拿到APP_SECRET和臨時的token:
圖片描述服務器

一樣的,在AWS S3中新建一個Bucket後,拿到Key和Secret:
圖片描述app

而後在配置文件中config/filesystem.php中寫上磁盤配置:composer

'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驅動,須要自定義下:ide

php artisan make:provider DropboxProvider

在boot()中寫上名爲dropbox的驅動:函數

Storage::extend('dropbox', function($app, $config) {
            $client = new DropboxClient($config['access_token'], $config['app_secret']);
            return new Filesystem(new DropboxAdapter($client));
        });

同時在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

相關文章
相關標籤/搜索