PHP バージョン 5.5 はコミュニティでサポートを終了したため、新しいアプリでは PHP 7 ランタイムを使用することを強くおすすめします。

ユーザーによるファイル アップロードの許可

リージョン ID

REGION_ID は、アプリを作成するときに選択するリージョンに基づいて Google が割り当てるコードです。既存のアプリでは省略可能でしたが、新しいアプリでは App Engine の URL に REGION_ID.r を含めることが必須になります。

移行がスムーズに行われるように、リージョン ID を使用するよう App Engine を徐々に更新しています。Google Cloud プロジェクトがまだ更新されていない場合、アプリにリージョン ID が表示されません。ID は既存のアプリでは省略可能なため、リージョン ID が既存のアプリで使用可能になったときに、URL を更新する、またはその他の変更を行う必要はありません。

詳しくは、リージョン ID をご覧ください。

Google Cloud Storage に直接アップロードする場合は、特定の URL に HTTP POST を行います(詳しくは後で説明します)。App Engine は特定のアップロード サービスを使用して投稿を処理し、Google Cloud Storage にファイルを書き込みます。ファイルの書き込みが完了すると、App Engine はアップロードの完了をアプリに通知します。アプリは完了時にのみ呼び出されるため、この方法では非常に大きいファイルをアップロードできます(現在の上限は 100 TB です)。

App Engine アプリから Google Cloud Storage に書き込む場合、インスタンス時間を消費し、コストがかかるため、ファイルを Google Cloud Storage に直接アップロードするほうが高速で、費用対効果が高くなります。また、アプリケーションに対するリクエスト内でファイルの書き込みは行われません。リクエストのタイムアウトも適用されないため、非常に大きなファイルでもアップロードが可能になります。

ファイル アップロードの実装

ユーザーにファイルのアップロードを許可するには:

  1. CloudStorageTools をインポートします。

    use google\appengine\api\cloud_storage\CloudStorageTools;
  2. .php ファイルで、次のように CloudStorageTools::createUploadUrl() メソッドを使用して、アプリケーション固有のアップロード URL を作成します。

    $options = ['gs_bucket_name' => $my_bucket];
    $upload_url = CloudStorageTools::createUploadUrl('/upload/handler', $options);

    使用可能なオプションについては、createUploadUrl オプションをご覧ください。my_bucketYOUR_APP_ID になります (デフォルトのバケットを使用している場合は REGION_ID.r.appspot.com)。

  3. この URL へのアップロードは、URL の作成後 10 分以内に開始する必要があります。また、URL の変更はできません。アップロードの開始前に URL の署名が確認されます。

  4. アップロードを許可するフォームに、この URL をアクションとして使用します。

    <form action="{{ upload_url }}" enctype="multipart/form-data" method="post">
        Files to upload: <br>
       <input type="file" name="uploaded_files" size="40">
       <input type="submit" value="Send">
    </form>

ファイルがアップロードされると、createUploadUrl の最初のパラメータとして指定されたパスに POST が実行されます。上記の例では、これは /upload_handler.php です。PHP ランタイムは適切な $_FILES スーパー グローバルを形成します。tmp_filename は Google Cloud Storage に新しくアップロードされたファイルの名前を表します。

たとえば、upload_handler.php に次のようなコンテンツが含まれているとします。

var_dump($_FILES);

hello.txt というファイルをアップロードすると、次のような出力が表示されます。

array(1) {
  ['uploaded_files']=>
  array(5) {
    ['name']=>    string(14) 'hello.txt'
    ['type']=>    string(10) 'text/plain'
    ['tmp_name']=>    string(73) 'gs://my_bucket/L2FwcHMtdXBsb2FkL2Jsb2JzL2IxNUFBVGNJNXNTd0VqR0tFSUtDRGxadGc'
    ['error']=>    int(0)
    ['size']=>    int(1452)
  }
}

アップロードが完了したら、アップロードされたファイルを gs:// ストリーム ラッパーで読み取ることができます。アップロードされた他のファイルと同様に、move_uploaded_file を使用します。次に例を示します。

$file_name = $_FILES['uploaded_files']['name'];
$temp_name = $_FILES['uploaded_files']['tmp_name'];
move_uploaded_file($temp_name, "gs://${my_bucket}/${file_name}.txt");

createUploadUrl オプション

次の表に有効な createUploadUrl オプションを示します。

オプション 説明
max_bytes_per_blob 整数。デフォルト値: unlimited。 アップロードする blob の最大サイズ。
max_bytes_total 整数。デフォルト値: unlimited。 アップロードする blob の合計サイズ。
gs_bucket_name 文字列。blob アップロードする Google Cloud Storage バケットの名前。値を指定しないと、blob はアプリケーションのデフォルト バケットにアップロードされます。