1

Python GAE アプリのクライアントが、事前に設定した特定のオブジェクト名と GCS パラメータ (キャッシュ コントロールや ACL など) を使用してファイルを GCS に直接アップロードし、アップロードが完了した後にいくつかのアクションを実行できるようにしたいと考えています。

私は現在、これに を使用しblobstore.create_upload_urlています。ただし、事前にパラメータやオブジェクト名を指定できないため、ファイル全体を「アップロードされた」コールバック ハンドラ内から GCS の新しい場所にコピーする必要があります。これは時間と (計算) リソースを消費するものであり、回避できるように思えます。

このプロセスを最適化する方法はありますか?

  • 正しい名前と正しい ACL + キャッシュ制御パラメーターを持つオブジェクトをすぐにアップロードするアップロード URL を作成できますか? (署名付き URL を簡単に調べましたが、それらは blobstore API のようなコールバック ハンドラーをサポートしていないようです)
  • そうでない場合、ファイルをバイトごとに新しい場所にコピーし、完了したら削除する必要がない方法はありますか? (ファイルを移動してその属性を変更できると便利です)

更新: GCS python クライアント ライブラリにcopy2今あることに気付きました。これは以前にはなかったと断言できたかもしれませんが、2番目の質問に答えているようです.

4

1 に答える 1

2

ポリシー ドキュメントを含む署名済みフォームを使用して、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 アップロード

于 2015-07-17T05:00:14.620 に答える