允许用户上传文件

区域 ID

REGION_ID 是 Google 根据您在创建应用时选择的区域分配的缩写代码。此代码不对应于国家/地区或省,尽管某些区域 ID 可能类似于常用国家/地区代码和省代码。对于 2020 年 2 月以后创建的应用,REGION_ID.r 包含在 App Engine 网址中。对于在此日期之前创建的现有应用,网址中的区域 ID 是可选的。

详细了解区域 ID

要将内容直接上传到 Google Cloud Storage,您需要对特定网址发出 HTTP POST 请求(稍后我们将对此进行介绍)。App Engine 随后使用特定的上传服务来处理该 POST 并将文件写入 Google Cloud Storage。文件写入完成后,App Engine 会通知您的应用上传已完成。由于只有在上传完成后才会调用您的应用,因此您可以使用此方法上传非常大的文件(可达到当前大小上限 100 TB)。

用户将文件直接上传到 Google Cloud Storage 比从 App Engine 应用写入 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_bucketYOUR_APP_ID。如果使用默认存储分区,则为 REGION_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>

文件上传后,系统会对指定为 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 上传到应用的默认存储分区。