ポリシー ドキュメントを含む署名済みフォームを使用して、GCS に直接アップロード (投稿) するためのPython、webapp2、jinja コードを次に示します。
def gcs_upload(acl='bucket-owner-read'):
""" jinja2 upload form context """
default_bucket = app_identity.get_default_gcs_bucket_name()
google_access_id = app_identity.get_service_account_name()
succes_redirect = webapp2.uri_for('_gcs_upload_ok', _full=True)
expiration_dt = datetime.now() + timedelta(seconds=300)
policy_string = """
{"expiration": "%s",
"conditions": [
["starts-with", "$key", ""],
{"acl": "%s"},
{"success_action_redirect": "%s"},
{"success_action_status": "201"},
]}""" % (expiration_dt.replace(microsecond=0).isoformat() + 'Z', acl, succes_redirect)
policy = base64.b64encode(policy_string)
_, signature_bytes = app_identity.sign_blob(policy)
signature = base64.b64encode(signature_bytes)
return dict(form_bucket=default_bucket, form_access_id=google_access_id, form_policy=policy, form_signature=signature,
form_succes_redirect=succes_redirect, form_acl=acl)
class GcsUpload(BaseHandler):
def get(self):
self.render_template('gcs_upload.html', **gcs_upload())
そしてフォームフィールド:
<form method="post" action="https://storage.googleapis.com/{{ form_bucket }}" enctype="multipart/form-data">
<input type="hidden" id="key" name="key" value="images/test.png">
<input type="hidden" name="GoogleAccessId" value="{{ form_access_id }}">
<input type="hidden" name="acl" value="{{ form_acl }}">
<input type="hidden" name="success_action_redirect" value="{{ form_succes_redirect }}">
<input type="hidden" name="success_action_status" value="201">
<input type="hidden" name="policy" value="{{ form_policy }}">
<input type="hidden" name="signature" value="{{ form_signature }}">
<input name="file" type="file">
<input type="submit" value="Upload">
</form>
こちらのフォームを使用したドキュメント GCS アップロード