Google App Engine PHP API でのファイルアップロード

ここでは Google App Engine の PHP を利用しているときに、ファイルをアップロードする方法を説明します。

Python や Java による API では、ブロブストアを利用したファイルアップロードについて説明しました。

Google App Engine の PHP API では 2014年5月現在ブロブストアへアップロードする API は提供されておらず、その代わり Google Cloud Storage へアップロード可能です。

アップロードフォームは次のように、CloudStrageTools の createUploadUrl メソッドで作成します。

<?php
require_once
  'google/appengine/api/cloud_storage/CloudStorageTools.php';
use google\appengine\api\cloud_storage\CloudStorageTools;

$options = ['gs_bucket_name' => 'foo.appspot.com' ];
$upload_url =
  CloudStorageTools::createUploadUrl('/bar', $options);
?>
<form 
  action="<?php echo $upload_url?>" 
  enctype="multipart/form-data" method="post">
  <input id='file1' 
    type="file" 
    name="uploaded_files">
  <submit value='Upload'>
</form>

ここでメソッドへのオプションとして、Google Cloud Storage のバケツ名を指定しています。

デフォルトでは、 "<アプリケーション ID>.appspot.com" という名前のバケツが作成されます。 これは Google App Engine の管理画面 Application Settings から確認できます。

さて、上記のアップロードフォームでファイルをアップロードすると、API が返したアップロード先にファイルをアップロードした後、 createUploadUrl メソッドに渡した URL にリダイレクトされます。(上記の例では '/bar')

リダイレクトされた先では、通常の PHP のファイルアップロードの場合と同様に、$_FILES からアップロードファイル情報を読み取ることが可能です。

グーグルクラウドストレージに保存されており、"gs://バケツ名/ファイル名" という名前になっています。これは $_FILES の一時ファイル情報 "tmp_name" からわかります。

もし、アップロードしたファイルを自分のプログラムで指定したファイル名で保存しなおす場合は、次のように "gs://バケツ名/ファイル名" として指定したファイル名を、 move_uploaded_file 関数に渡します。

<?php
$gs_name = $upfile['uploaded_files']['tmp_name'];
$new_gs_name = "gs://foo.appspot.com/test.jpg";

move_uploaded_file($gs_name, $new_gs_name);
?>

グーグルクラウドストレージ内でのパスの指定方法以外は、PHP を(クラウド環境ではない)通常の環境で利用したのと同様の形で、 アップロードされたファイルを扱えるので非常に簡単です。