Google App Engine: загрузить файл и другие поля в одном запросе

Я хочу загрузить изображение в blobstore, потому что я хочу поддерживать файлы размером более 1 МБ. Теперь единственный способ, который я могу найти - это для клиента выдать POST, где он отправляет метаданные, такие как географическое местоположение, теги и что-то, что сервер помещает в объект. В этом объекте сервер также помещает ключ большого двоичного объекта, в котором будут храниться фактические данные изображения, и сервер завершает запрос, возвращая клиенту URL-адрес, возвращенный create_upload_url(). Это работает нормально, однако я могу получить несогласованность, например, если второй запрос никогда не выполняется, и, следовательно, большой двоичный объект никогда не заполняется. Сущность теперь указывает на пустой BLOB-объект.

Единственное решение этой проблемы, которое я вижу, состоит в том, чтобы вызвать отложенную задачу, которая будет проверять, был ли большой объект заполнен загрузкой. Я не большой поклонник этого решения, поэтому я предполагаю, если кто-нибудь имеет в виду лучшее решение.

1 ответ

Я прошел точно такой же мыслительный процесс, но на Java, и в итоге использовал Apache Commons FileUpload. Я не знаком с Python, но вам просто нужен способ обработки multipart/form-data загрузить.

Я загружаю изображение и мои дополнительные поля вместе, используя JQuery, чтобы собрать данные составной формы, которые я затем POST на мой сервер.

Затем на стороне сервера я беру файл и записываю его в Google Cloud Storage, используя клиентскую библиотеку Google Cloud Storage (ссылка на Python). Это можно сделать одним чанком или "поточным", если это большой файл. Как только оно появится в GCS, ваше приложение App Engine сможет читать его, используя ту же библиотеку, или вы можете использовать его напрямую с общедоступным URL-адресом, в зависимости от установленного ACL.

Другие вопросы по тегам