Выбор имени объекта Google Cloud Storage при загрузке файла с помощью Python blobstore API

Я перехожу из хранилища blobstore в Google Cloud Storage в своем приложении Python Google App Engine. Я хотел бы использовать API blobstore при загрузке в GCS. Это совершенно нормально, согласно документации Python GAE относительно blobstore.

Поток работает так же, как и при хранении в blobstore. Клиент запрашивает URL-адрес загрузки, blobstore.create_upload_url (...) создает его, клиент загружает файл через составной POST, а затем сервер перенаправляет обработчик загрузки в мое приложение GAE.

Проблема в том, что, хотя мне нужно выбрать ведро GCS (это один из параметров вызова create_upload_url), я не понимаю, как я могу выбрать имя файла. Я бы хотел разбить его по папкам. Вдохновение исходит от

Google App Engine Blobstore в Google Cloud Storage Migration Tool, где имя файла разорвано, чтобы можно было управлять просмотром "папок" GCS.

Я знаю только один способ назвать файл GCS - отказаться от API blobstore. Вместо этого клиент загрузит файл в обработчик GAE, который будет использовать lib.cloudstorage для записи данных файла в GCS - точно так же, как цитируемый инструмент миграции.

Я бы потерял полезные свойства GCS, такие как повторные попытки при ошибках во время загрузки.

Вопрос: есть ли способ загрузить файл непосредственно в GCS, влияя на способ наименования результирующего объекта GCS.


person Michael    schedule 18.06.2015    source источник
comment
cloud.google.com/storage/docs/   -  person voscausa    schedule 22.06.2015
comment
или используйте gcs copy, delete, чтобы переименовать объект после загрузки gcs blobstore   -  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