0

На обычном (негибком) экземпляре Google App Engine вы можете использовать API Blobstore и создать URL-адрес, чтобы позволить пользователю загружать файл непосредственно в ваш Blobstore. Когда он загружается, ваше приложение-приложение приложения уведомляется о местонахождении файла и может его обработать. Пример кода python:Google Cloud Storage create_upload_url - App Engine Flexible Python

from google.appengine.ext import blobstore 
upload_url = blobstore.create_upload_url('/upload_photo') 

См. the Blobstore docs.

Переход на гибкую среду Google App Engine, usage of the Blobstore has been largely replaced by Cloud Storage. В таком случае существует ли эквивалент create_upload_url?

В моей текущей реализации выполняется стандартная загрузка файла в приложение для флагов python. Затем происходит что-то вроде:

from flask import request 
from google.cloud import storage 

uploaded_file = request.files.get('file') 

gcs = storage.Client() 
bucket = gcs.get_bucket(bucket_name) 
blob = bucket.blob(blob_name) 
blob.upload_from_string(
    uploaded_file.read(), 
    content_type=uploaded_file.content_type 
) 

Это кажется, что это удваивает нагрузку сети по сравнению с create_upload_url, поскольку файл приходит в мой экземпляр приложения двигателя, а затем сразу же копируются из. Таким образом, загрузчик будет готов ждать дополнительное время, пока это происходит. Предположительно, я также понесу дополнительные расходы на App Engine за это. Есть ли способ лучше?

У меня есть рабочие, которые позже обрабатывают загруженный файл, но я, как правило, снова загружаю файл из облачного хранилища в свой код, потому что я не думаю, что вы можете предположить, что у работника все равно будет доступ к файлу, хранящемуся в файловой системы экземпляра. Поэтому я не получаю никакой пользы от того, что файл загружен в мой экземпляр, а не прямо в его место хранения.

+0

Я ответил на аналогичный вопрос пару дней назад https://stackoverflow.com/questions/42002013/replacing-blobstore-upload-handler-with-gcs/42002289#42002289, который может вам помочь. Вы можете использовать тот же метод создания обработчика загрузки. – Aaron

+0

Спасибо @Samson, но я не думаю, что пакет 'google.appengine.ext.blobstore' доступен в гибкой среде App Engine. Может, я ошибаюсь? –

+0

@JONG Вы нашли ответ для этого? –

ответ

0

Я начал использовать create_resumable_upload_session для создания подписанного URL-адреса, к которому может загружать приложение на стороне клиента. Что-то вроде:

gcs = storage.Client() 
bucket = gcs.get_bucket(BUCKET) 
blob = bucket.blob(blob_name) 
signed_url = blob.create_resumable_upload_session(content_type=content_type) 

Затем, когда клиент успешно закачанный файл в нашем хранилище, я присоединяюсь к Pub/Sub уведомления о создании с помощью этого Cloud Pub/Sub Notifications for Cloud Storage.

0

Каждая капля создан новый клиент Google Cloud Storage имеет public_url свойство:

from flask import request 
from google.cloud import storage 

uploaded_file = request.files.get('file') 

gcs = storage.Client() 
bucket = gcs.get_bucket(bucket_name) 
blob = bucket.blob('blob_name') 
blob.upload_from_string(
    uploaded_file.read(), 
    content_type=uploaded_file.content_type 
) 
url = blob.public_url 

-

С Blobstore, система обработчика GAE в вашем случае заботится о загруженном файле вы перейти к URL-адресу загрузки. Я не уверен, что это проблема, связанная с этим в вашем коде. Если ваш нынешний подход проблематичен, вы можете подумать о том, чтобы делать клиентскую загрузку, а не передавать файл через App Engine. GCS имеет API REST, и клиент облачного хранилища использует его под ним, поэтому вы можете читать и загружать файл непосредственно в GCS на стороне клиента, если это более удобно. Там есть firebase.google.com/docs/storage/web/upload-files, чтобы облегчить вам процесс.

+0

Спасибо за помощь. Ваше решение по-прежнему требует, чтобы весь файл был отправлен на мой экземпляр ядра приложения, а затем перенаправлен в Google Cloud Storage, неся на себя плату за вход и выход, верно?С create_upload_url пользователь загружает прямо в Blobstore, и поэтому я бы взял на себя только плату за эту загрузку. Имеет ли это смысл? –

+0

Хм, с помощью Blobstore, системный обработчик GAE в вашем экземпляре заботится о загруженном файле, который вы передаете в URL-адрес загружаемого файла. Я не уверен, что это проблема, связанная с этим в вашем коде. Если ваш текущий подход является проблематичным, вы можете подумать о том, как делать клиентскую сторону для загрузки. GCS имеет API REST, и клиент облачного хранилища использует его под ним, поэтому вы можете читать и загружать файл непосредственно в GCS на стороне клиента, если это более удобно. Там https://firebase.google.com/docs/storage/web/upload-files, чтобы облегчить вам процесс –

Смежные вопросы