允許使用者上傳檔案

區域 ID

REGION_ID 是 Google 根據您在建立應用程式時選取的地區所指派的簡寫代碼。雖然某些區域 ID 可能看起來與常用的國家/地區代碼相似,但此代碼並非對應國家/地區或省份。如果是 2020 年 2 月後建立的應用程式,App Engine 網址會包含 REGION_ID.r。如果是在此日期之前建立的現有應用程式,網址中則可選擇加入地區 ID。

進一步瞭解區域 ID

您直接將檔案上傳至 Google Cloud Storage 時,系統會對特定網址發出 HTTP POST,相關資訊請見下文。然後,App Engine 會使用特定「上傳服務」來處理 Post,並將檔案寫入 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() 方法,藉此建立應用程式專屬的上傳網址。範例如下:

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

    如要進一步瞭解可用的選項,請參閱 createUploadUrl 選項。請注意,my_bucket 會是 YOUR_APP_IDREGION_ID.r.appspot.com (如果使用預設值區)。

  3. 請注意,您必須在網址建立完成的 10 分鐘內,開始上傳到這個網址。而且,您無法以任何方式變更這個網址,因為網址已經過簽署,且在上傳開始之前會先檢查簽名。

  4. 使用這個網址做為您用來接受上傳的表單動作,例如:

    <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>

檔案上傳完成後,系統會將 POST 傳送至指定為 createUploadUrl 第一個參數的路徑,在上述範例中,這個路徑為 /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 會上傳至應用程式的預設值區。