LaravelでGoogle Cloud Storageへ保存&取得する方法

さてさて、前回の記事「危険!Laravelで「config:cache」を使う時の注意点」では Google Cloud API の話題をお届けしましたので、この流れで今回はGoogle Storage をLaravelで操作する方法をお届けしたいと思います。

というのも、通常でしたらクラウド・ストレージはアマゾンのS3を使うのが主流なのかなという印象なんですけど、実はGoogle APIでサイズの大きいファイルを利用する場合、一旦ストレージへファイルをアップロードしないといけない場合があるので、きっと需要はあるんだろうと判断しました。

ということで、今回のお題は次のとおりになります。

Laravel でGoogle Cloud Storage を使ってファイルをアップロード&ダウンロードする!

ぜひお楽しみください😊✨

実行環境: Laravel 5.8, PHP 7.2, nginx 1.14.0

Google Cloudで必要な設定をする

アカウントを用意する

なにはともあれGoogle Cloudが使えるようになっていないといけませんので、Google Cloud へアクセスし(アカウントがなければ作成して)ログインをしてください。

プロジェクトをつくる

アカウントができたら、「プロジェクト」を作成します。
画面左上にある以下の部分をクリックして新しいプロジェクトを作成しておいてください。(ここではそのままDev Testというプロジェクトを使います)

認証情報を設定し、キーになる json を取得する

次に認証情報を作成しますので、画面左上にあるハンバーガー・ボタンをクリックしてメニューを表示し、「APIとサービス > 認証情報」をクリックしてください。

すると、次のようなページが表示されますので「認証情報を作成 > サービスアカウントキー」をクリックします。

次に、サービスアカウントとJSONを選択して作成ボタンをクリックします。

すると次のようなポップアップが出て jsonファイルがダウンロードされます。
この jsonファイルを使ってGoogle Cloudへアクセスしますので、Laravelのstorage/jsonにでも設置しておくといいでしょう。(管理しやすいようにjsonのファイル名をgoogle_api_key.jsonへ変更しています)

Google Storageにバケットをつくる

では続いて、Storageの設定です。
先ほどと同じくページ左上のハンバーガー・ボタンをクリックしてメニューを表示し、「Storage」をクリックしてください。

すると、以下のように表示されますので「バケットを作成」をクリックします。

そして、次の画面でバケットを作成します。

※ 名前は他の人が使っていないものを指定する必要があります。また、今回は国内だけでの運用を想定しているので「Regional + Tokyo」に設定していますが、ここはお好みで変更してください。

入力&選択が終わったら作成ボタンをクリックすれば完了です!

バケットとオブジェクトについて

Google Cloudでは「バケット」と「オブジェクト」という名前が出てきますが、これはパソコンでいう「フォルダ」と「ファイル」と同じようなものです。

つまり、バケットの中にオブジェクトがたくさん入るイメージです。

↓↓↓こんなイメージ。これから「オブジェクト」をLaraelでアップロードしていきます!

LaravelからGoogle Storageへアクセスする

準備

パッケージのインストール

プログラムを書いていく前にGoogle Storageにアクセスするためのパッケージをcomposerでインストールしておきましょう。

composer require google/cloud-storage

.env へ認証情報を書き込む

次に、Google CloudからダウンロードしたjsonファイルのパスをGOOGLE_APPLICATION_CREDENTIALSとして.envに登録しておきます。

GOOGLE_APPLICATION_CREDENTIALS=/home/sukohi/xxxxxxxx/laravel58/storage/json/google_api_key.json

※ 注意点:前回記事で書いたようにphp artisan config:cacheをしてしまうとenv()が効かなくなるためうまくいかなくなります。そのため、php artisan config:clearでキャッシュを削除しておいてください。

アップロードするテストファイルを用意

今回はstorage/text/test.txtというファイルを作成して実行してみます。

ファイルのアップロード

では、実際にアップロードするコードを見てみましょう。

use Google\Cloud\Storage\StorageClient;

$client = new StorageClient();
$bucket = $client->bucket('xxxxxxxxxx'); // 作成したバケット名
$bucket->upload(
    fopen(storage_path('text/test.txt'), 'r')
);

やっていることは、まずStorageClientのインスタンスを作成し、そこからバケット名(先ほど作成したものです)を指定してバケットオブジェクトを取得。そして、ファイルを指定してアップロードという流れになっています。

実際にコードを実行してストレージをチェックしてみましょう。

はい!
うまくtest.txt がアップロードされました😊✨

ファイルのダウンロード

では、先ほどアップロードしたtest.txtをダウンロードして、ローカル環境にtest_from_gs.txtという名前で保存してみましょう。

$client = new StorageClient();
$bucket = $client->bucket('xxxxxxxxxx'); // 作成したバケット名
$object = $bucket->object('test.txt');   // ファイル名を指定
$object->downloadToFile(storage_path('text/test_from_gs.txt'));

やり方は、先ほどと同じくバケットを取得して、さらにそこからオブジェクトを取得します。そして、downloadToFIle()で内容を保存すれば以下のようにダウンロードが完了します。

ファイルを削除する

では、最後にファイル(オブジェクト)の削除です。

$client = new StorageClient();
$bucket = $client->bucket('xxxxxxxxxx'); // 作成したバケット名
$object = $bucket->object('test.txt');   // ファイル名を指定
$object->delete();

といってもこれも簡単で、バケットからオブジェクトを取得してdelete()を実行するたけです。

ただ、注意が必要なのが返り値(return)が存在しない(google/cloud-storage version 1.11 現在)ことです。

そのため、削除が成功したかどうかを知るためには以下のように try 〜 catch を使うといいでしょう。

try {

    // 省略
    $object->delete();

} catch (\Exception $e) {

    // 削除失敗

}

ちなみに

もしGoogle APIの認証がうまくいかない場合は、権限がきちんと設定できていない可能性があるので、次の手順を試してみてください。

まず、ハンバーガー・ボタンをクリックしてメニューを表示し、「IAMと管理 > IAM」をクリックします。

すると、IAMページが表示されるのでページ上部にある「追加」というリンクをクリックします。

すると、メンバー追加のフォームが表示されるので「新しいメンバー」にダウンロードした json内のclient_emailにかかれているメールアドレス(例:xxxxxxxx@xxxxxxx.iam.gserviceaccount.com)を入力し、役割を「ストレージ管理者」として保存をしてください。

これで権限の設定は完了です。

ということで今回はGoogle StorageLaravelで操作する方法をお届けしました。ぜひお役にたてると嬉しいです。

ではでは〜!

この記事が役立ちましたらシェアお願いします😊✨