Google App Engine の PHP 7系のランタイムを使い、Cloud Storage にファイルをアップロードする時の実装方法を調べたら意外と出てこなかったので書いてみます。
っても、別に普通に $_FILES
使うだけですが。
ちなみに、GAE で php73 のランタイムを使う事を想定しています。
よくある例
GAE にデプロイするファイル中に、GCSへアップロードするファイルを含め、スクリプトで GCS へアップロードする
動作検証としてはやるのは分かります。
が、こんなことするくらいなら最初から GCS 置いた状態でスタートしますよね。
まぁ、一応サンプルとしては以下のような感じ。
use GoogleCloudStorageStorageClient; $bucketName = 'sample.backet'; $source = 'sample.jpg'; $objectName = 'uploaded_sample.jpg'; $storage = new StorageClient(); $file = fopen($source, 'r'); $bucket = $storage->bucket($bucketName); $object = $bucket->upload($file, [ 'name' => $objectName ]);
やってることはこんな感じです。
アップロードスクリプトと同じディレクトリに置いてある sample.jpg を GCS へアップロードしている。
問題なく動くと思います。
WEBサイトで使えるように公開する
では、発展系。
アップロードしたファイルを、WEBサイトで使えるようにします。
$object = $bucket->upload($file, [
'name' => $objectName,
'predefinedAcl' => 'publicRead'
]);
単純に、先ほどのサンプルの upload じのオプションで predefinedAcl
を publicRead
として設定するのみ。
これを指定することで、https://storage.googleapis.com/sample.backet/uploaded_sample.jpg
でアクセス可能になります。
フォームからアップロードする
では本題。
WEBフォームで画像ファイルを指定して、PHP@GAE 経由で GCS にファイルを保存、URLを取得して HTML で表示。
form.php
まずフォームのソース。
<form action="upload" enctype="multipart/form-data" method="post"> <input name="file_upload" type="file" /> <input type="submit" value="アップロード" /> </form>
超適当ですw
upload.php
use GoogleCloudStorageStorageClient;
$bucketName = 'sample.backet';
$source = $_FILES['file_upload']['tmp_name'];
$objectName = 'uploaded/' . time() . '.jpg';
$storage = new StorageClient();
$file = fopen($source, 'r');
$bucket = $storage->bucket($bucketName);
$object = $bucket->upload($file, [
'name' => $objectName,
'predefinedAcl' => 'publicRead'
]);
echo "<img src=""https://storage.googleapis.com/$bucketName/$objectName"">";
やってる事は一般的なサーバー上に設置した PHP で処理する際と同じ。
一時ファイルのパスを取得して、それを fopen して GCS へ保存する。
ファイル名を処理するのが面倒なので、タイムスタンプで処理してたり、jpg 限定になってたりするので、ここはもうちょい綺麗にする必要がありますが、基本的にはこれだけ。
php55 との違い
PHP5系のランタイムだと CloudStorageTools を使って、画像のリサイズとか色々できて便利そう。
が、このツールは PHP7系のランタイムでは利用不可。
getImageServingUrl とかかなり強力で、Cloudinary 的なことができそうなのに残念。
このバージョンによって激しく仕様が変わるところが、GCP の最大の特徴ですよね。
全く互換性がないって、すごいと思います。
コメント