Memilih nama objek Google Cloud Storage saat mengunggah file menggunakan Python blobstore API

Saya bermigrasi dari blobstore ke Google Cloud Storage di aplikasi python Google App Engine saya. Saya ingin menggunakan API blobstore saat mengunggah ke GCS. Tidak apa-apa, menurut dokumentasi python GAE mengenai blobstore

Alurnya berfungsi seperti menyimpan ke blobstore. Klien meminta URL unggahan, blobstore.create_upload_url(...) membuatnya, klien mengunggah file melalui POST multi-bagian, dan kemudian server mengalihkan ke penangan unggahan di aplikasi GAE saya.

Masalahnya adalah meskipun saya harus memilih keranjang GCS (ini adalah salah satu parameter panggilan create_upload_url), saya tidak mengerti bagaimana cara memilih nama file. Saya ingin memecahnya menjadi beberapa folder. Inspirasinya datang dari

Google App Engine Blobstore ke Alat Migrasi Google Cloud Storage jika nama filenya rusak sehingga penjelajahan "folder" GCS dapat dikelola.

Saya hanya mengetahui satu cara untuk memberi nama file GCS - dengan tidak menggunakan API blobstore. Sebaliknya, klien akan mengunggah file ke pengendali GAE, yang akan menggunakan lib.cloudstorage untuk menulis data file ke GCS - persis seperti yang dilakukan alat Migrasi yang dikutip.

Saya akan kehilangan barang GCS seperti percobaan ulang pada kesalahan saat mengunggah.

Pertanyaannya: apakah ada cara untuk mengunggah file langsung ke GCS, sekaligus memengaruhi cara penamaan objek GCS yang dihasilkan.


person Michael    schedule 18.06.2015    source sumber
comment
cloud.google.com/storage/docs/   -  person voscausa    schedule 22.06.2015
comment
atau gunakan salinan gcs, hapus untuk mengganti nama objek setelah blobstore gcs diunggah   -  person voscausa    schedule 22.06.2015
comment
atau atau gunakan unggahan blobstore dan pindahkan (tulis) ke gcs   -  person voscausa    schedule 22.06.2015


Jawaban (1)


Gudang : https://github.com/voscausa/appengine-gcs-upload

Contoh kode untuk opsi pertama.

  • di mana Anda dapat memberi nama objek keranjang
  • dan gunakan url yang ditandatangani untuk mengakses keranjang

Dokumen: https://cloud.google.com/storage/docs/reference-methods?hl=bg#postobject

Templat unggahan:

<!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>

Pengendali formulir unggah:

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)
person voscausa    schedule 22.06.2015