BlobstoreService serve () не предоставляет Content-Length

1

Я хочу обслуживать файлы, хранящиеся в Google Cloud Storage (GCS) с помощью Google App Engine (GAE) для пользователей. Я использую код ниже:

BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
BlobKey blobKey = blobstoreService.createGsBlobKey("/gs/myBucket/myObjectName");
blobstoreService.serve(blobKey, response);

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

Однако Content-Length удаляется из ответа (так что в Chrome нет индикатора выполнения), даже если я это делаю

response.addHeader("Content-Length", String.valueOf(gcsObject.getSizeBytes()));

или

response.setContentLength((int) gcsObject.getSizeBytes());

перед фактической подачей файла (первый блок кода).

Ответ, который я получаю с сервера, следующий:

access-control-allow-origin:*
cache-control:private
content-disposition:attachment; filename="MyVideoFile.mp4"
content-type:video/mp4
date:Mon, 21 Apr 2014 10:06:03 GMT
expires:Thu, 01 Jan 1970 00:00:00 GMT
server:Google Frontend
status:200 OK
version:HTTP/1.1

Когда отсутствует Content-Length Chrome (Version 34.0.1847.116 m), иногда развращает файл - например. если файл составляет 180 МБ, иногда это 178 МБ, иногда 179 МБ и т.д. Я не знаю, коррелированы ли эти два.

Все файлы, которые я обслуживаю, находятся в диапазоне размеров файлов 100-250 МБ.

Если я публикую файл и передам его по прямому URL-адресу (через https://storage.googleapis.com/...), я получаю Content-Length и фактический индикатор выполнения (в Chrome), и все работает отлично (без коррупции),

Каково решение?

Теги:
google-cloud-storage
google-app-engine
google-chrome
blobstore

1 ответ

2

Это известная проблема.

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

Однако, если это частный файл, вы можете использовать клиентскую библиотеку GCS, чтобы читать содержимое блоба и обслуживать его через ваш сервлет. Затем заголовок Content-Length будет автоматически установлен GAE.

  • 0
    Если я использую клиентскую библиотеку GCS и обслуживаю ее напрямую (копирование байтового массива в ответ с использованием copy(Channels.newInputStream(readChannel), response.getOutputStream()); ), я получаю 32-мегабайтную ошибку ограничения HTTP на App Engine. Есть ли какой-нибудь шаблон / сервлет / код шаблона для файлов размером более 32 МБ, использующих multipart загрузку или ...?
  • 0
    AFAIK, нет. Это жесткий предел для экземпляров интерфейса GAE.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню