Google App Engine:将上传的文件存储在 Google 云存储中

Google App Engine: store uploaded file in Google Cloud Storage

我已经设法在 Google App Engine 应用程序的 webapp2 处理程序的 post 方法中在 GCS 中创建了一个文件。我看不到如何在 GCS 中创建的文件中复制 posted 文件的内容。 这是我的代码

 inFile =  self.request.POST.multi['file'].file
 gcs_file = gcs.open(filename,
                    'w',
                    content_type='text/plain',
                    options={'x-goog-meta-foo': 'foo',
                             'x-goog-meta-bar': 'bar'},
                    retry_params=write_retry_params)
  while 1:
        line = inFile.readline()
        if not line: break
        gcs_file.write(line)
  gcs_file.close()

进程结束时,GCS 中的文件为 0 字节

更新 我不使用 blobstore 是有原因的。使用 Blobstore 时,您必须创建一个 url 并将其返回给客户端。执行实际上传的是客户端。 INSTEAD 我需要先加密服务器上的文件,然后再将其放入 GCS。因此我需要从客户端接收文件,在服务器上加密并存储在GCS中。

在 Google App Engine 应用程序中将文件上传到 GCS 的推荐方法似乎是使用带有 gcs 存储桶支持的 blobstore。

https://cloud.google.com/appengine/docs/python/blobstore/#Python_Using_the_Blobstore_API_with_Google_Cloud_Storage

您不应该直接上传到您的 webapp2 处理程序的原因有很多。

  1. 文件大小限制。
  2. 请求持续时间的限制。
  3. 额外费用,因为当您的处理程序是 运行 时您需要付费。

仅举几例...

更新

解决问题的更新:您仍然应该上传到 blobstore。分 3 个步骤完成:

  1. 上传到 blobstore。
  2. 从 blobstore 读取,并加密写入 GCS。
  3. 从 blobstore 中删除。

我已使用以下方法成功 POST 将文件发送到 GCS:

def post(self):
    write_retry_params = gcs.RetryParams(backoff_factor=1.1)
    filename = '/{MY-BUCKET-NAME}/static.txt'

    gcs_file = gcs.open(
        filename,
        'w',
        content_type='text/plain',
        options={'x-goog-meta-foo': 'foo',
                 'x-goog-meta-bar': 'bar'},
        retry_params=write_retry_params)

    inFile = self.request.POST.multi['file'].file
    while 1:
        line = inFile.readline()
        if not line:
            break
        gcs_file.write(line)
        logging.info('Wrote line: {}'.format(line))

    gcs_file.close()

这是来自控制台的小日志消息:

I 09:20:32.979 2015-05-07  200      84 B   1.13s /static
    76.176.106.172 - - [07/May/2015:09:20:32 -0700] "POST /static HTTP/1.1" 200 84 - "curl/7.37.1" "{MY-APP}" ms=1131 cpu_ms=1355 cpm_usd=0.000009 loading_request=1 instance=00c61b117cee89e66d34a42c5bbe3cf2b0bb06b5 app_engine_release=1.9.20
I 09:20:32.832 Wrote line: stack
I 09:20:32.833 Wrote line: overflow

这是我上传的 test.txt 文件:

stack
overflow

以及我使用的 cURL 命令:

curl -F"file=@/Users/{name}/test.txt" http://{MY-APP}/videostatic

如果您仍然从 readline()read() 获得 0 个字节,我将不得不假设您的客户端没有发送正确的多部分消息。