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

时间:2015-05-06 21:00:54

标签: python google-app-engine webapp2

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

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

2 个答案:

答案 0 :(得分:1)

在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. 因为您的处理程序正在运行时收取额外费用。
  4. 仅举几例......

    <强>更新

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

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

答案 1 :(得分:1)

我已使用以下方法成功将文件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()

以下是来自Console的小日志消息:

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个字节,我将不得不假设您的客户端没有发送正确的多部分消息。