九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
さてさて、前回の記事「危険!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 Storage
をLaravel
で操作する方法をお届けしました。ぜひお役にたてると嬉しいです。
ではでは〜!