我想通过Google App Engine(GAE)向用户提供存储在Google云端存储(GCS)上的文件。我正在使用以下代码:
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
),有时会破坏文件 - 例如。如果文件是180MB,有时它是178MB,有时是179MB等。我不知道这两个是否相关。
我所服务的所有文件都在100-250MB的文件大小范围内。
如果我公开发布文件并通过直接网址(通过https://storage.googleapis.com/...
)投放,我会获得Content-Length
和实际进度条(在Chrome中),一切正常(没有损坏)。
解决方案是什么?
答案 0 :(得分:2)
这是一个已知的issue。
如果这是一个公共文件,那么,正如您已经提到的,您可以通过直接云存储网址提供服务。
但是,如果这是一个私有文件,那么您可以使用GCS Client Library来读取blob内容并通过servlet提供它。然后GAE会自动设置Content-Length
标题。