2016年7月31日 星期日

Laravel 使用 GCS 做為儲存空間

前言
Laravel 有內建 Filesystem 套件,所以可以用來和例如 Amazon S3, Dropbox, Google Cloud Storage 等等服務串接

但找了一下發現和 Google Cloud Storage (GCS) 這方面的資料好像滿零散的
所以整理了一下

正文
GCS 使用的 API 和 S3 是相同的,但是目前只有 v2 有支援,所以需要安裝 v2 的 s3 相關套件,於 composer.json 的 require 加上

 { ...
 "league/flysystem-aws-s3-v2": "~1.0"
  }
 


然後 composer update 或是 install


再來是建立 GCS 專用的 Laravel Filesystem Provider Service
於 app\Providers 建立 GCSServiceProvider.php

 namespace App\Providers;
 
 use Illuminate\Support\ServiceProvider;
 use Storage;
 use Aws\S3\S3Client;
 use League\Flysystem\AwsS3v2\AwsS3Adapter;
 use League\Flysystem\Filesystem;
 
 class CloudStorageServiceProvider extends ServiceProvider{
     public function boot(){
         Storage::extend('gcs', function( $app, $config )
         {
             $client = S3Client::factory([
                 'key'    => $config['key'],
                 'secret' => $config['secret'],
                 'region' => $config['region'],
                 'base_url' => $config['base_url'],
             ]);
 
             return new Filesystem(new AwsS3Adapter($client, $config['bucket']));
         });
     }
 
     public function register(){
     }
 }
 


然後在 config/app.php 載入剛剛建立的 Provider
 providers => [
 ...
     App\Providers\GCSServiceProvider::class,
 ...
 ]
 



接下來是在 Laravel 中的 config/filesystem.php 加上 GCS 的設定
(這邊要到 Google Cloud Console 取得 Storage 相關的 API Key )

 'gcs' => [
     'driver' => 'gcs',
     'key' => 'KEYYYYYYY',
     'secret' => 'SEC_KEY',
     'region' => 'ASIA-EAST1',
     'bucket' => 'BUKET_NAME',
     'base_url'=>'https://storage.googleapis.com',
 ],
 



接下來就可以使用了,範例:
 $disk = Storage::disk('gcs');
 // public 為將此檔案公開
 $disk->put('123.txt', Good, file content’, public');
 
 // 刪除檔案
 $disk->delete('123.txt');