Python 谷歌应用引擎:在谷歌云存储中存储上传的文件
我已经设法在GCS中创建了一个文件,该文件位于Google App Engine应用程序的webapp2处理程序的post方法中。我看不出如何在GCS中创建的文件中复制已发布文件的内容。 这是我的密码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'
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处理程序的原因有很多
我已使用以下方法成功地将文件发布到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位置。