我已经设法在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中。
答案 0 :(得分:1)
在Google App Engine应用程序中将文件上传到GCS的推荐方法似乎是使用带有gcs存储桶支持的blobstore。
有很多原因导致您不应该直接上传到您的webapp2处理程序。
仅举几例......
<强>更新强>
要解决问题的更新:您应该仍然上传到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个字节,我将不得不假设您的客户端没有发送正确的多部分消息。