BlobstoreService serve()不提供Content-Length

时间:2014-04-21 10:18:42

标签: java google-app-engine google-chrome google-cloud-storage blobstore

我想通过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中),一切正常(没有损坏)。

解决方案是什么?

1 个答案:

答案 0 :(得分:2)

这是一个已知的issue

如果这是一个公共文件,那么,正如您已经提到的,您可以通过直接云存储网址提供服务。

但是,如果这是一个私有文件,那么您可以使用GCS Client Library来读取blob内容并通过servlet提供它。然后GAE会自动设置Content-Length标题。