Загрузить файл размером более 40 МБ в Google App Engine?
Я создаю веб-приложение Google App Engine для "преобразования" файлов размером 10–50 млн.
Сценарий:
- Пользователь открывает http://fixdeck.appspot.com/ в веб-браузере
- Пользователь нажимает "Обзор", выбирает файл, отправляет
- Сервлет загружает файл как InputStream
- Сервлет преобразовывает файл
- Сервлет сохраняет файл как OutputStream
- Браузер пользователя получает преобразованный файл и спрашивает, где его сохранить, непосредственно в ответ на запрос на шаге 2.
(Пока я не реализовал шаг 4, сервлет отправляет файл обратно без его преобразования.)
Проблема: он работает для файлов 15 МБ, но не для файла 40 МБ, говоря: "Ошибка: запрос слишком большой. Ваш клиент отправил слишком большой запрос".
Есть ли обходной путь против этого?
Исходный код: https://github.com/nicolas-raoul/transdeck
Обоснование: http://code.google.com/p/ankidroid/issues/detail?id=697
3 ответа
GAE имеет жесткие ограничения 32 МБ для HTTP-запросов и HTTP-ответов. Это ограничит размер загрузок / загрузок непосредственно в / из приложения GAE.
Пересмотренный ответ (с помощью API Blobstore.)
Google предоставляет API-интерфейс Blobstore для обработки больших файлов в GAE (до 2 ГБ). Обзорная документация содержит полный пример кода. Ваша веб-форма загрузит файл в интернет-магазин. Затем API Blobstore переписывает POST обратно в ваш сервлет, где вы можете выполнить преобразование и сохранить преобразованные данные обратно в хранилище BLOB-объектов (как новый BLOB-объект).
Оригинальный ответ (не рассматривал Blobstore как вариант.)
Я думаю, что для загрузки GAE единственным обходным решением будет разбить файл на несколько частей на сервере, а затем собрать заново после загрузки. Это, вероятно, не выполнимо, используя прямую реализацию браузера, хотя.
(В качестве альтернативного варианта, возможно, вы могли бы отправить преобразованный файл из GAE во внешнее местоположение загрузки (например, S3), где он мог бы быть загружен браузером без ограничений предела GAE. Я не верю, что инициированные GAE соединения имеют такой же запрос Размер ответа / ответа, но я не уверен. В любом случае, вы все равно будете ограничены максимальным временем запроса в 30 секунд. Чтобы обойти это, вам нужно обратиться к экземплярам GAE Backend и придумать что-то вроде стратегия асинхронной загрузки.)
Для загрузки файлов большего размера я прочитал о возможности использования файловых API-интерфейсов HTML5, чтобы разделить файл на несколько частей для загрузки, а затем восстановить на сервере. Пример: http://www.html5rocks.com/en/tutorials/file/dndfiles/. Тем не менее, я не представляю, насколько практичным является решение, которое действительно связано с изменением характеристик и возможностей браузера.
Вы можете использовать интернет -магазин для загрузки файлов размером до 2 гигабайт.
При загрузке файлов большего размера вы можете считать, что файл разбит на небольшие наборы запросов (должен быть меньше 32 МБ, что является текущим пределом), которые поддерживает Google App Engine.
Проверьте этот пакет на примерах - https://github.com/pionl/laravel-chunk-upload
Вы также можете использовать API-интерфейс blobstore для прямой загрузки в облачное хранилище. Удар это ссылка
https://cloud.google.com/appengine/docs/python/blobstore/
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>