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

リージョン ID

REGION_ID は、アプリの作成時に選択したリージョンに基づいて Google が割り当てる省略形のコードです。一部のリージョン ID は、一般的に使用されている国や州のコードと類似しているように見える場合がありますが、このコードは国または州に対応するものではありません。2020 年 2 月以降に作成されたアプリの場合、REGION_ID.r が App Engine の URL に含まれています。この日付より前に作成されたアプリの場合、URL のリージョン ID は省略可能です。

詳しくは、リージョン 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 はアプリケーションのデフォルト バケットにアップロードされます。