Я хочу обслуживать файлы, хранящиеся в 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), и все работает отлично (без коррупции),
Каково решение?
Это известная проблема.
Если это общедоступный файл, то, как вы уже упоминали, вы можете обслуживать его с помощью прямого URL облачного хранилища.
Однако, если это частный файл, вы можете использовать клиентскую библиотеку GCS, чтобы читать содержимое блоба и обслуживать его через ваш сервлет. Затем заголовок Content-Length
будет автоматически установлен GAE.
copy(Channels.newInputStream(readChannel), response.getOutputStream());
), я получаю 32-мегабайтную ошибку ограничения HTTP на App Engine. Есть ли какой-нибудь шаблон / сервлет / код шаблона для файлов размером более 32 МБ, использующихmultipart
загрузку или ...?