Python 谷歌应用引擎:在谷歌云存储中存储上传的文件

Python 谷歌应用引擎:在谷歌云存储中存储上传的文件,python,google-app-engine,webapp2,Python,Google App Engine,Webapp2,我已经设法在GCS中创建了一个文件,该文件位于Google App Engine应用程序的webapp2处理程序的post方法中。我看不出如何在GCS中创建的文件中复制已发布文件的内容。 这是我的密码 inFile = self.request.POST.multi['file'].file gcs_file = gcs.open(filename, 'w', content_type='text/plain'

我已经设法在GCS中创建了一个文件,该文件位于Google App Engine应用程序的webapp2处理程序的post方法中。我看不出如何在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并将其沙回到客户端。执行实际上载的是客户端。
相反,我需要在将文件放入GCS之前对服务器上的文件进行加密。因此,我需要从客户端接收文件,在服务器上对其进行加密并将其存储在GCS中。

在Google App Engine应用程序中将文件上载到GCS的推荐方法似乎是使用带有GCS bucket backing的blobstore

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

  • 文件大小的限制
  • 请求持续时间的限制
  • 额外费用,因为处理程序运行时会向您计费
  • 举几个例子

    更新

    要解决更新的问题:您仍然应该上传到blobstore。分3个步骤执行此操作:

  • 上传到blobstore
  • 从blobstore读取,然后加密写入GCS
  • 从blobstore中删除

  • 我已使用以下方法成功地将文件发布到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字节,我将不得不假设您的客户端没有发送正确的多部分消息。

    您没有一次写入整个文件有什么原因吗?另外,你是否已经验证过,可能是通过
    日志记录
    ,你已经正确地收到了该文件,其内容长度与你从帖子中期望的长度相同?啊,我记得你在上一个问题中提到过。您似乎死心塌地地想要上传到webapp2处理程序。停下来。你做错了。使用BLOBSTORE。对您可以使用blobstore将文件发送到GCS。你真的应该通读整个blobstore概览。如果您不执行基本步骤,我不确定您是否会在这里得到任何帮助。@Zachary我已经检查过该文件是通过验证self.request.POST.multi['file']上传的。filename实际上返回了预期的字符串。我希望这意味着内容也被上传。我也尝试过gcs_file.write(infle.read()),但仍然得到0bytes@Zachary我已经验证了字节是否正确上传,因为上传的大小是正确的。但是该循环有一些问题,因为它只进入一次(并且readline返回null)。我应该如何阅读文件内容?@user2771609:“如果你不做基本的步骤,我不确定你会在这里得到任何帮助。”。。。谷歌提供了这个API,所以它是有效的。即使Sindico真的不需要绕过Blobstore,只是想这样做,但这仍然是一个足够好的解决方案(对于GAE而言)。@Sindico:非常欢迎。我很好奇,你的计划是什么?我犯了一个愚蠢的错误。加密将输入文件保留在EOF位置。