Загрузите изображение в облачный магазин Google через веб-страницу в форме python, движка приложений google, angularjs

Сначала позвольте мне сказать,

Думаю, я прочитал все сообщения об обмене стеками, которые казались относящимися к этой теме. *

Что я пытаюсь сделать:

  1. Я пытаюсь разрешить определенным пользователям отправлять изображения в облачное хранилище Google через форму на моем сайте.
  2. Другое требование, наряду с отправкой этого изображения в облачное хранилище, заключается в том, что мне нужно создать модель этого изображения в хранилище данных с соответствующими атрибутами.

Я не уверен, что лучше всего сделать, потому что ...

Подходы, о которых я читал:

Есть несколько подходов к переносу изображений в облачное хранилище:

Я прочитал много противоречивой информации,

и я так много читал, что не могу понять,

тем не мение,

Думаю, разрешение было:

Для blobstore:

  1. Метод blobstore.uploadtocloudstoragethingmethod может иметь или не иметь предельный размер загрузки файла (нет, это не фактическое имя вызова или метода) 2. Метод blobstore звучал так, как будто он будет постепенно сокращен?

Для Jason API:

Однако клиентская библиотека включает оптимизацию App Engine, поэтому использование REST API может потребовать дополнительного времени на разработку. Примечание. Сервер разработки App Engine поддерживает клиент облачного хранилища. Он не поддерживает REST API.

Для клиентской библиотеки:

Я не знаю. Пока все выглядит нормально. Вот метод, который я собираюсь использовать:

cloudstorage.open (filename, mode = 'r', content_type = None, options = None, read_buffer_size = storage_api.ReadBuffer.DEFAULT_BUFFER_SIZE, retry_params = None)

В режиме чтения (r) открывает указанный объект облачного хранилища для чтения. В режиме записи w, если указанный файл существует, он открывает его для перезаписи (добавление не поддерживается). Если файл не существует, он создается в указанном сегменте.

Что я использую:

  1. Google App Engine
  2. Python (для обработчиков, моделей и т. Д.)
  3. angularjs и jquery (интерфейс)
  4. json иногда (бэкэнд)
  5. Шаблон GAE (не спрашивайте)

Что я собираюсь делать:

  1. Получите изображение пользователя:

Итак, я нашел эту форму, которую я протестировал. Он берет файл с вашего компьютера:

<form action="<?php echo $upload_url?>" enctype="multipart/form-data"
method="post">
Files to upload: <br>    <input type="file" name="uploaded_files"    size="40">    <input type="submit" value="Send">

(Нет, я не могу использовать php-мусор в действии. Я взял его из какого-то места в документации, но я протестировал его, он захватывает файл, нет, он не отправляет, и это было бы глупо ожидать этого)

  1. Измените мой текущий обработчик (который заботится о создании модели изображения в хранилище данных), чтобы он также использовал

Этот способ:

cloudstorage.open (filename, mode = 'r', content_type = None, options = None, read_buffer_size = storage_api.ReadBuffer.DEFAULT_BUFFER_SIZE, retry_params = None)

В режиме чтения (r) открывает указанный объект облачного хранилища для чтения. В режиме записи w, если указанный файл существует, он открывает его для перезаписи (добавление не поддерживается). Если файл не существует, он создается в указанном сегменте.

Мои проблемы на данный момент

Я не знаю, как работает эта форма, и я не знаю, как получить нужную информацию из этой формы в обработчик, и какая информация понадобится этому обработчику, чтобы я мог ее обработать, создать модель (я уже знаю как создать модель в хранилище данных, уже сделав это), а также отправить изображение в облачное хранилище Google с помощью этого метода:

cloudstorage.open (filename, mode = 'r', content_type = None, options = None, read_buffer_size = storage_api.ReadBuffer.DEFAULT_BUFFER_SIZE, retry_params = None)

В режиме чтения (r) открывает указанный объект облачного хранилища для чтения. В режиме записи w, если указанный файл существует, он открывает его для перезаписи (добавление не поддерживается). Если файл не существует, он создается в указанном сегменте.

Кто-нибудь может привести мне пример? Я не могу найти никаких хороших релевантных сообщений или документов о том, что поместить в форму, чтобы она захватила файл, захватила другие данные формы, которые пользователь заполняет, а затем отправила изображение в облачное хранилище Google.

--ОБНОВИТЬ-- :

Итак, сразу после публикации я погуглил gcs.open, что привело к следующему сообщению:

как загрузить изображение в облачное хранилище через приложение двигатель?

Я считаю, что это может помочь в том, что касается бэкэнда, у меня остался один вопрос.

Чтобы перепрошить вопрос:

из сообщения выше

Вопросы:

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

  2. Куда это вставить: enctype = multipart / form-data?

  3. будет номер 2. испортить мои другие данные формы? Мне нужно больше информации, чем просто это изображение в запросе на публикацию


person Community    schedule 30.07.2015    source источник


Ответы (2)


Чтобы ответить на ваши вопросы:

  1. Я не знаю, как будет называться изображение, я бы хотел использовать существующее или, возможно, случайное. Есть предложения?

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

  1. Куда это вставить: enctype = "multipart / form-data"?

Enctype - это атрибут формы, поэтому его необходимо установить в элементе формы в вашем HTML:

<form enctype="multipart/form-data" action="/save" ... >
  1. не повлияет ли номер 2. на другие мои данные формы? Мне нужно больше информации, чем просто это изображение в запросе на публикацию

Нет, не должно. Просто добавьте дополнительные поля ввода формы, и все они будут отправлены вместе с данными формы.

person sander    schedule 31.07.2015
comment
1. Спасибо :) в настоящее время ищу способы использования уникальных посетителей. Подумайте о том, чтобы просто создать имя, а затем посмотреть, существует ли этот файл в gcs. Однако это могло бы напрасно тратить запросы. 2. Спасибо! В итоге я использовал ‹form action = {{url | safe}} enctype = multipart / form-data method = post›, и все прошло хорошо. 3. Еще не пробовал, спасибо за информацию :) - person ; 31.07.2015
comment
Верно по поводу лишних запросов. Что вы могли сделать (при условии, что вы храните другие данные в хранилище данных для файла), так это использовать ключ хранилища данных в качестве имени файла. Это гарантированно будет уникальным. - person sander; 31.07.2015
comment
Это интересная идея, я бы поинтересовался, какие риски безопасности могут возникнуть в хранилище данных, поскольку было бы легко раскрыть имя ключа через браузер, но добавление случайных данных поверх этого идентификатора могло бы помочь? Возможно, это можно было бы расшифровать. Не уверен ... Я работал над другим проектом, в котором использовались уникальные методы, но я не помню, как я использовал этот метод. - person ; 31.07.2015
comment
Я не думаю, что возникнет проблема раскрытия ключа хранилища данных, если вы не используете конфиденциальную часть ключа идентификатора. Однако я больше думал, что вы можете использовать ключ для его хранения (обеспечивая уникальность), но при его извлечении из облачного хранилища, чтобы отправить его пользователю, вы переименуете файл с исходным именем, которое вы сохранили в хранилище данных. - person sander; 31.07.2015
comment
Я не уверен, как это будет происходить, поскольку в облачном хранилище есть фактическое изображение, а модель данных содержит путь к этому изображению. Если это не то же самое, отобразить изображение пользователю было бы невозможно. Тем не менее, я нашел свой старый код, но он все равно будет включать запросы к хранилищу данных и использует уникальный класс из дополнительных компонентов webapp2. - person ; 31.07.2015
comment
Я нашел это сегодня. Вы также можете использовать ключ объекта, чтобы получить закодированную строку, подходящую для встраивания в URL: url_string = sandy_key.urlsafe (), чтобы решить проблему безопасности, или нет: Примечание: строка, безопасная для URL выглядит загадочно, но не зашифровано! Его можно легко декодировать, чтобы восстановить тип и идентификатор исходного объекта: key = Key (urlsafe = url_string) kind_string = key.kind () identify = key.id () - person ; 31.07.2015
comment
Термин «ключ» немного вводит в заблуждение. Ключ - это не что иное, как уникальный идентификатор объекта, объединяющий вместе вид объекта и идентификатор объекта внутри этого типа. Это не дает никому никакого доступа ни к чему, поэтому нет ничего плохого в том, что у кого-то есть ключ для сущности. Если, конечно, вы не хотите, чтобы пользователь знал имена ваших моделей и идентификаторы объектов, под которыми они хранятся. Возможно, это будет иметь место, если у вас есть модель пользователя и вы используете их адрес электронной почты как часть идентификатора ключа объекта. Это будет означать, что вы получите что-то вроде Key ('User', '[email protected]'). - person sander; 01.08.2015

Вы также можете использовать подписанную форму для прямой загрузки в GCS. Таким образом, вам не понадобится blobstore или обработчик сообщений. И вы можете контролировать время ожидания и имя объекта с помощью документа политики. См. Мой ответ здесь.

person voscausa    schedule 31.07.2015
comment
Не уверен, что подписанная форма что-то значит - вы имеете в виду подписанный URL, согласно cloud.google.com/storage/docs/access-control?hl=en#Signed-URL? - person Alex Martelli; 01.08.2015
comment
Я думал, что подписанная форма больше подходит для этого решения. Документы: cloud.google.com/storage/docs/reference-methods#postobject < / а> - person voscausa; 01.08.2015