Загрузка большого файла Google App Engine
Я пытаюсь загрузить данные в Google App Engine (используя GWT). Я использую виджет FileUploader, и сервлет использует InputStream для чтения данных и вставки непосредственно в хранилище данных. Запустив его локально, я могу успешно загружать большие файлы, но когда я развертываю его в GAE, меня ограничивает 30 секундное время запроса. Есть ли способ обойти это? Или есть способ, которым я могу разделить файл на более мелкие куски и отправить меньшие куски?
Ответы
Ответ 1
В настоящее время GAE накладывает ограничение на 10 МБ на загрузку файла (и размер ответа), а также пределы 1 МБ на многие другие вещи; так что даже если бы у вас было сетевое соединение достаточно быстро, чтобы накачать более 10 МБ в течение 30 секунд, это было бы бесполезно. Google сказал (я слышал, что Guido van Rossum упоминает, что вчера в Pycon Italia Tre), что он планирует преодолеть эти ограничения в будущем (по крайней мере, для пользователей GAE, которые платят за использование, превышать квоты), не уверены, планы распространяются на пользователей GAE, которые не платят, и обычно должны принимать меньшие квоты, чтобы получить бесплатное использование GAE).
Ответ 2
Используя BlobStore, вы 1 ГБ ограничение размера и специальный обработчик называемый неудивительно BlobstoreUpload Handler, который не должен давать вам проблем с тайм-аутом при загрузке.
Также проверьте http://demofileuploadgae.appspot.com/ (sourcecode, исходный ответ), который делает именно то, что вы просите.
Кроме того, проверьте остальные GWT-Examples.
Ответ 3
вам нужно будет сделать загрузку на другой сервер - я считаю, что 30-секундный тайм-аут нельзя обойти. Если есть способ, пожалуйста, поправьте меня! Мне бы хотелось знать, как это сделать!
Ответ 4
30-секундный временной интервал ответа применяется только к выполнению кода. Таким образом, загрузка фактического файла как части тела запроса исключается из этого. Таймер запускается только после того, как запрос будет полностью отправлен на сервер клиентом, и ваш код начнет обрабатывать отправленный запрос. Следовательно, не имеет значения, насколько медленным является ваше клиентское соединение.
Загрузка файла в Google App Engine с использованием Datastore и ограничение времени отклика 30 секунд
Ответ 5
Самое близкое, что вы могли бы получить, - разбить его на куски, когда вы храните его в GAE, а затем, когда вы его загрузите, соедините его вместе, выпустив отдельные запросы AJAX.
Ответ 6
Я бы согласился с чередованием данных на меньшие Blobs и имел две таблицы: один содержит метаданные (имя файла, размер, количество загрузок и т.д.), а другое содержит куски, эти куски связаны с таблицей метаданных внешний ключ, я думаю, это выполнимо...
Или, когда вы загружаете все куски, вы можете просто объединить их в один блок с одной таблицей.
Но проблема в том, что вам понадобится толстый клиент для обслуживания данных chunking, таких как Java-апплет, который должен быть подписан и доверен вашим клиентам, чтобы он мог получить доступ к локальной файловой системе
Ответ 7
Если у вашего запроса не хватает времени на запрос, вы можете сделать это немного. Возможно, ваши файлы слишком большие, и вам нужно будет их обрезать на клиенте (с помощью чего-то вроде Flash или Java или платформы для загрузки, например pupload).
Как только вы получите файл в приложении, есть еще одна проблема - ограничения хранилища данных. Здесь у вас есть два варианта:
-
вы можете использовать службу BlobStore, которая имеет довольно хороший API для обработки больших загрузок 50 мегабайт
-
вы можете использовать что-то вроде bigblobae, которое может хранить практически неограниченные размерные капли в обычном хранилище данных appengine.