การเลือกชื่อวัตถุ Google Cloud Storage เมื่ออัปโหลดไฟล์โดยใช้ Python blobstore API

ฉันกำลังย้ายจาก blobstore ไปยัง Google Cloud Storage ในแอป Google App Engine python ฉันต้องการใช้ blobstore API เมื่ออัปโหลดไปยัง GCS ไม่เป็นไร ตาม เอกสารประกอบ GAE python เกี่ยวกับ blobstore

โฟลว์ทำงานเหมือนกับการจัดเก็บไปยัง blobstore ไคลเอ็นต์ร้องขอ URL การอัปโหลด blobstore.create_upload_url(...) สร้างขึ้น ไคลเอ็นต์อัปโหลดไฟล์ผ่าน POST หลายส่วน จากนั้นเซิร์ฟเวอร์เปลี่ยนเส้นทางไปยังตัวจัดการการอัปโหลดในแอปพลิเคชัน GAE ของฉัน

ปัญหาคือแม้ว่าฉันต้องเลือกที่ฝากข้อมูล GCS (ซึ่งเป็นหนึ่งในพารามิเตอร์ของการเรียก create_upload_url) ฉันไม่เห็นว่าฉันจะเลือกชื่อไฟล์ได้อย่างไร ฉันต้องการแบ่งออกเป็นโฟลเดอร์ แรงบันดาลใจมาจาก.

Google App Engine Blobstore ไปยัง Google Cloud Storage Migration Tool โดยที่ชื่อไฟล์ใช้งานไม่ได้เพื่อให้สามารถจัดการการเรียกดู "โฟลเดอร์" ของ GCS ได้

ฉันรู้วิธีตั้งชื่อไฟล์ GCS เพียงวิธีเดียว - เพื่อละทิ้ง blobstore API ไคลเอ็นต์จะอัปโหลดไฟล์ไปยังตัวจัดการ GAE แทน ซึ่งจะใช้ lib.cloudstorage เพื่อเขียนข้อมูลไฟล์ลงใน GCS เหมือนกับที่เครื่องมือ Migration ที่ยกมาทำ

ฉันจะสูญเสียสารพัด GCS เช่น การลองใหม่เมื่อมีข้อผิดพลาดระหว่างการอัปโหลด

คำถาม: มีวิธีอัปโหลดไฟล์ไปยัง GCS โดยตรงหรือไม่ ในขณะที่ส่งผลต่อวิธีการตั้งชื่อออบเจ็กต์ GCS ที่เป็นผลลัพธ์


person Michael    schedule 18.06.2015    source แหล่งที่มา
comment
cloud.google.com/storage/docs/   -  person voscausa    schedule 22.06.2015
comment
หรือใช้สำเนา gcs ลบเพื่อเปลี่ยนชื่อออบเจ็กต์หลังจากอัปโหลด blobstore gcs   -  person voscausa    schedule 22.06.2015
comment
หรือหรือใช้การอัปโหลด blobstore และย้าย (เขียน) ไปที่ gcs   -  person voscausa    schedule 22.06.2015


คำตอบ (1)


พื้นที่เก็บข้อมูล : https://github.com/voscausa/appengine-gcs-upload

โค้ดตัวอย่างสำหรับตัวเลือกแรก

  • โดยที่คุณสามารถตั้งชื่อวัตถุที่ฝากข้อมูลได้
  • และใช้ URL ที่ลงนามเพื่อเข้าถึงที่เก็บข้อมูล

เอกสาร: 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)
person voscausa    schedule 22.06.2015