🗾

【PHP】Laravelで`spatie/laravel-google-cloud-storage`を使用する

2022/10/11に公開

概要

Laravelでは、ファイル保存等を行うためのStorageの機能が用意されています。【Laravel】AWS S3にファイルをアップロードするの記事にある通り、ローカルだけでなくS3にも保存できるようなものが用意されています。
S3の記事はけっこうあったのですが、GoogleCloudStorage(GCS)を使用する時にどうすれば良いかという記事があまり無かったので、今回メモ書きします。

対応方針

今回は記事の表題にあるspatie/laravel-google-cloud-storageのライブラリを使用してみます。このライブラリはドライバーの位置付けなので、設定すればLaravelのStorageのインターフェースでGCSのファイル操作が行えます。

実装サンプル

まずはfilesystems.phpの設定部分です。事前にGoogle API のサービスアカウントで認証するための JSON / P12 キーを取得するなどの記事を参考にして、サービスアカウント認証の為のjsonを用意します。

filesystems.php
'disks' => [
    'gcs' => [
        'driver' => 'gcs',
        'key_file_path' => base_path() . '/' . env('GOOGLE_CLOUD_STORAGE_KEY_PATH'), // サービスアカウントのための認証ファイルへのパス
        'bucket' => env('GOOGLE_CLOUD_STORAGE_BUCKET'), // GCSに設定したバケット名
        'visibility' => 'public',
        'throw' => true, // エラー時にexceptionをthrowしたい場合はtrue
    ],
]

実際にファイルをアップロードする実装は以下です。GCS特有というわけではないのですが、アップロードするファイルのURLを取得するために、Laravel s3 Storage: undefined method 'url'のstackoverflowを参考に、disk取得時のメソッドにコメントを追加しています。

MyStorageService
<?php

namespace App\Services\File;

use Illuminate\Support\Facades\Storage;

class MyStorageService
{

    public function uploadFile(
        $file,
        $filePath,
        $fileName,
    ) {
        $fileFullPath = $filePath . '/' . $fileName;
        $disk = $this->getDisk();
        $disk->putFileAs($filePath, $file, $fileName);
        return $disk->url($fileFullPath);
    }

    /**
     * Return the gcs storage disk.
     *
     * @return \Illuminate\Filesystem\FilesystemAdapter
     */
    private function getDisk()
    {
        return Storage::disk('gcs');
    }
}

その他

使用時にCannot get legacy ACL for an object when uniform bucket-level access is enabled...というエラーが発生したので、Cloud registryで権限の編集をするとCannot get legacy ACL for an object when uniform bucket-level access is enabled...となるの記事を参照し、Access controlをきめ細かい管理に切り替えるに変更しました。

Discussion