Загрузить файл размером более 40 МБ в Google App Engine? - PullRequest
8 голосов
/ 01 августа 2011

Я создаю веб-приложение Google App Engine для «преобразования» файлов размером 10K ~ 50M

Сценарий:

  1. Пользователь открывает http://fixdeck.appspot.com в веб-браузере
  2. Пользователь нажимает «Обзор», выбирает файл, отправляет
  3. Сервлет загружает файл как InputStream
  4. Файл преобразований сервлетов
  5. Сервлет сохраняет файл как OutputStream
  6. Браузер пользователя получает преобразованный файл и спрашивает, где его сохранить, непосредственно в ответ на запрос на шаге 2

(Пока я не реализовал шаг 4, сервлет отправляет файл обратно без его преобразования.)

Проблема: Он работает для файлов 15 МБ, но не для файла 40 МБ, говоря: "Ошибка: запрос слишком большой. Ваш клиент отправил слишком большой запрос."

Есть ли обходной путь против этого?

Исходный код: https://github.com/nicolas-raoul/transdeck
Обоснование: http://code.google.com/p/ankidroid/issues/detail?id=697

Ответы [ 3 ]

9 голосов
/ 01 августа 2011

Вы можете использовать в интернет-магазине для загрузки файлов размером до 2 гигабайт.

9 голосов
/ 01 августа 2011

GAE имеет жесткие ограничения 32 МБ для запросов HTTP и ответов HTTP.Это ограничит размер загрузки / выгрузки непосредственно в / из приложения GAE.

Исправленный ответ (Использование Blobstore API.)

Google предоставляет API Blobstore для обработки больших файлов в GAE (до 2 ГБ).Обзорная документация содержит полный пример кода.Ваша веб-форма загрузит файл в интернет-магазин.Затем API Blobstore переписывает POST обратно в ваш сервлет, где вы можете выполнить преобразование и сохранить преобразованные данные обратно в хранилище BLOB-объектов (как новый BLOB-объект).

Оригинальный ответ (DidnНе рассматривайте Blobstore как опцию.)

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

(В качестве альтернативы, возможно, вы могли бы отправить преобразованный файл из GAE во внешнее местоположение загрузки (например, S3), где он мог бы быть загружен браузеромбез ограничений лимита GAE. Я не верю, что инициированные GAE соединения имеют такие же ограничения размера запроса / ответа, но я не уверен. В любом случае, вы все равно будете ограничены максимальным временем запроса 30 секунд. Чтобы обойти это, выМне нужно посмотреть GAE Backend и придумать какую-то асинхронную стратегию загрузки.)

Для загрузки больших файлов я читал о возможности использования файла HTML5API-интерфейсы для нарезки файла на несколько фрагментов для загрузки, а затем восстановления на сервере.Пример: http://www.html5rocks.com/en/tutorials/file/dndfiles/#toc-slicing-files.Однако я не представляю, насколько практичным является решение, которое действительно связано с изменением спецификаций и возможностей браузера.

0 голосов
/ 25 марта 2016

Вы также можете использовать API-интерфейс blobstore для прямой загрузки в облачное хранилище. Удар по ссылке

https://cloud.google.com/appengine/docs/python/blobstore/#Python_Using_the_Blobstore_API_with_Google_Cloud_Storage

upload_url = blobstore.create_upload_url(
  '/upload_handler',
  gs‌​_bucket_name = YOUR.BUCKET_NAME)

template_values = { 'upload_url': upload_url } 
_jinjaEnvironment = jinjaEnvironment.JinjaClass.getJinjaEnvironemtVariable()

if _jinjaEnvironment: 
  template = _jinjaEnvironment.get_template('import.html')

Затем в index.html:

<form action="{{ upload_url }}" 
      method="POST" 
      enctype="multipart/form-data">
  Upload File:
  <input type="file" name="file">
</form>
...