我正在我的Google App Engine python应用程序中从blobstore迁移到Google Cloud Storage。我想在上传到GCS时使用blobstore API。 根据{{3}}
,这完全没问题流程就像存储到blobstore一样。客户端请求上传URL,blobstore.create_upload_url(...)创建它,客户端通过多部分POST上传文件,然后服务器重定向到我的GAE应用程序中的上传处理程序。
问题在于,虽然我必须选择GCS存储桶(它是create_upload_url调用的参数之一),但我看不出如何选择文件名。我想把它分解成文件夹。
的灵感来自于GAE python documentation regarding blobstore 文件名被破坏的地方,以便浏览GCS“文件夹”是可管理的。
我只知道一种命名GCS文件的方法 - 放弃blobstore API。 相反,客户端会将文件上传到GAE处理程序,GAE处理程序将使用lib.cloudstorage将文件数据写入GCS - 就像引用的迁移工具一样。
我会丢失GCS好东西,比如在上传过程中重试错误。
问题:有没有办法将文件直接上传到GCS,同时影响生成的GCS对象的命名方式。
答案 0 :(得分:0)
存储库:https://github.com/voscausa/appengine-gcs-upload
第一个选项的示例代码。
文档:https://cloud.google.com/storage/docs/reference-methods?hl=bg#postobject
上传模板:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>'gcs_upload'</title>
</head>
<body>
<form action="http://storage.googleapis.com/{{ form_bucket }}"
method="post" enctype="multipart/form-data">
<input type="text" name="key" value="">
<input type="hidden" name="GoogleAccessId" value="{{ form_access_id }}">
<input type="hidden" name="acl" value="bucket-owner-read">
<input type="hidden" name="success_action_redirect" value="{{ form_succes_redirect }}">
<input type="hidden" name="policy" value="{{ form_policy }}">
<input type="hidden" name="signature" value="{{ form_signature }}">
<input type="file" name="file">
<input type="submit" value="Upload">
</form>
</body>
</html>
上传表单处理程序:
class GcsUpload(BaseHandler):
def get(self):
default_bucket = app_identity.get_default_gcs_bucket_name()
google_access_id = app_identity.get_service_account_name()
succes_redirect = 'http://www.example.com/success'
policy_string = """
{"expiration": "2015-06-22T18:11:11Z",
"conditions": [
["starts-with", "$key", ""],
{"acl": "bucket-owner-read"},
{"success_action_redirect": "%s"},
]}""" % succes_redirect
policy = base64.b64encode(policy_string)
_, signature_bytes = app_identity.sign_blob(policy)
signature = base64.b64encode(signature_bytes)
self.render_template('gcs_upload.html', form_bucket=default_bucket, form_succes_redirect=succes_redirect,
form_access_id=google_access_id, form_signature=signature, form_policy=policy)