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。
您不应该直接上传到您的 webapp2 处理程序的原因有很多。
- 文件大小限制。
- 请求持续时间的限制。
- 额外费用,因为当您的处理程序是 运行 时您需要付费。
仅举几例...
更新
解决问题的更新:您仍然应该上传到 blobstore。分 3 个步骤完成:
- 上传到 blobstore。
- 从 blobstore 读取,并加密写入 GCS。
- 从 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 个字节,我将不得不假设您的客户端没有发送正确的多部分消息。
我已经设法在 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。
您不应该直接上传到您的 webapp2 处理程序的原因有很多。
- 文件大小限制。
- 请求持续时间的限制。
- 额外费用,因为当您的处理程序是 运行 时您需要付费。
仅举几例...
更新
解决问题的更新:您仍然应该上传到 blobstore。分 3 个步骤完成:
- 上传到 blobstore。
- 从 blobstore 读取,并加密写入 GCS。
- 从 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 个字节,我将不得不假设您的客户端没有发送正确的多部分消息。