[email protected] - フォームからファイルを Cloud Storage にアップロードする

投稿日:

Google App Engine の PHP 7系のランタイムを使い、Cloud Storage にファイルをアップロードする時の実装方法を調べたら意外と出てこなかったので書いてみます。

っても、別に普通に $_FILES 使うだけですが。

ちなみに、GAE で php73 のランタイムを使う事を想定しています。

よくある例

GAE にデプロイするファイル中に、GCSへアップロードするファイルを含め、スクリプトで GCS へアップロードする

動作検証としてはやるのは分かります。

が、こんなことするくらいなら最初から GCS 置いた状態でスタートしますよね。

まぁ、一応サンプルとしては以下のような感じ。

use Google\Cloud\Storage\StorageClient;

$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フォームで画像ファイルを指定して、[email protected] 経由で 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 Google\Cloud\Storage\StorageClient;

$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 "";

やってる事は一般的なサーバー上に設置した PHP で処理する際と同じ。

一時ファイルのパスを取得して、それを fopen して GCS へ保存する。

ファイル名を処理するのが面倒なので、タイムスタンプで処理してたり、jpg 限定になってたりするので、ここはもうちょい綺麗にする必要がありますが、基本的にはこれだけ。

php55 との違い

PHP5系のランタイムだと CloudStorageTools を使って、画像のリサイズとか色々できて便利そう。

が、このツールは PHP7系のランタイムでは利用不可。

getImageServingUrl とかかなり強力で、Cloudinary 的なことができそうなのに残念。

画像の提供 | PHP 5 の App Engine スタンダード環境 | Google Cloud

Cloud Storage ツール用の App Engine API には、画像ファイルを簡単に提供できる次のメソッドが用意されています。 ローカルの CloudStorageTools.getImageServingUrl() CloudStorageTools.deleteImageServingUrl()

このバージョンによって激しく仕様が変わるところが、GCP の最大の特徴ですよね。

全く互換性がないって、すごいと思います。

更新日: