1

我有一个基于 Google App Engine (Java) 的应用程序,它将文件数据存储在 Google Cloud 存储中。

此文件下载 servlet 在我的本地 eclipse 环境中运行良好,当部署到 apppot 域时,这适用于简单的文本文件,但适用于任何文档(显示在浏览器中的新选项卡中),但如果我尝试使用任何其他二进制文件(doc , jpeg, gif 等)似乎什么都不做,在服务器端也没有抛出错误。我直接检查了谷歌云存储中的文件夹,文件被正确存储并且能够直接访问它,但不能通过应用引擎这样做。

如果我遗漏了什么,你能告诉我吗?

下面的代码片段,

         try {
             FileService newfileService = FileServiceFactory.getFileService();
             AppEngineFile file = new AppEngineFile(cloudpath) ;
             FileReadChannel channel = newfileService.openReadChannel(file, false);
             BufferedInputStream bis = new BufferedInputStream(Channels.newInputStream(channel));
             BufferedOutputStream bos = new BufferedOutputStream(resp.getOutputStream());
             resp.setHeader("Content-Disposition", "inline;filename=\"" + file.getNamePart() + "");
             int b = 0;
             while((b = bis.read()) != -1) {
                 bos.write(b);
             }
             bos.flush();
         } catch (Exception e) {
             e.printStackTrace();
         }
4

2 回答 2

1

与其尝试自己流式传输文件,不如使用 BlobstoreService.serve 方法。这需要注意或流式传输,并且可以用于任何大小的文件。

就像是

BlobstoreService blobService = BlobstoreServiceFactory.getBlobstoreService();
blobService.serve(blobService.createGsBlobKey(cloudpath), resp);
于 2012-06-04T02:28:03.020 回答
0

您将尝试以下语句顺序。

...
resp.setContentType("application/octet-stream");
resp.setHeader("Content-Disposition", "inline;filename=\"" + file.getNamePart() + "");
BufferedOutputStream bos = new BufferedOutputStream(resp.getOutputStream());

int b=0;
...
于 2012-06-04T00:14:57.947 回答