用于Java和Google云存储的Google应用程序引擎

用于Java和Google云存储的Google应用程序引擎,java,google-app-engine,google-cloud-storage,Java,Google App Engine,Google Cloud Storage,我有一个基于Google App Engine(Java)的应用程序,它将文件数据存储在Google云存储中 这个文件下载servlet在我的本地eclipse环境中工作得很好,当部署到appspot域时,它适用于简单的文本文件,但适用于任何文档(在浏览器的新选项卡中显示),但是如果我尝试使用任何其他二进制文件(doc、jpeg、gif等),似乎什么都不做,服务器端也不会抛出错误。我直接在谷歌云存储的文件夹中进行了检查,文件存储正确,可以直接访问,但无法通过应用程序引擎访问 如果我遗漏了什么,你

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

这个文件下载servlet在我的本地eclipse环境中工作得很好,当部署到appspot域时,它适用于简单的文本文件,但适用于任何文档(在浏览器的新选项卡中显示),但是如果我尝试使用任何其他二进制文件(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();
         }

您将尝试以下语句顺序

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

int b=0;
...

您将尝试以下语句顺序

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

int b=0;
...

您应该使用BlobstoreService.service方法,而不是自己尝试流式传输文件。这将照顾或流式传输,并可用于任何大小的文件

差不多

BlobstoreService blobService = BlobstoreServiceFactory.getBlobstoreService();
blobService.serve(blobService.createGsBlobKey(cloudpath), resp);

您应该使用BlobstoreService.service方法,而不是自己尝试流式传输文件。这将照顾或流式传输,并可用于任何大小的文件

差不多

BlobstoreService blobService = BlobstoreServiceFactory.getBlobstoreService();
blobService.serve(blobService.createGsBlobKey(cloudpath), resp);

非常感谢您愿意尝试此修复,但是eclipse为createGsBlobKey方法抛出了一个语法错误-“对于类型BlobstoreService,createGsBlobKey(字符串)方法未定义”。我正在使用AppEngine SDK 1.6.3.0升级到1.6.6。问题仍然存在,在本地环境中工作正常,但当我部署到服务器时,问题仍然存在。适用于文本文件,但不适用于任何其他格式。我是否必须为此启用计费以使其持续工作?到目前为止,我是在免费配额内运行的。启用了计费,也没有任何区别。进行了一些额外的实验,当我上载一些.jpg文件时,下载部分发生,并在新的浏览器选项卡中显示部分图像,下载停止。直接签出云存储中的所有文件,能够无任何问题地访问它。这是系统中的错误吗?看起来我没有删除旧版本的app engine实例。我用上面的代码删除了当前文件并将其设置为默认值,现在我收到一个不同的文件错误,如.doc-error:Server error服务器遇到错误,无法完成您的请求。如果问题仍然存在,请报告您的问题,并提及此错误消息和导致此问题的查询。感谢您尝试此修复,但eclipse正在为createGsBlobKey方法抛出语法错误-“类型BlobstoreService的createGsBlobKey(String)方法未定义”。我正在使用AppEngine SDK 1.6.3.0升级到1.6.6。问题仍然存在,在本地环境中工作正常,但当我部署到服务器时,问题仍然存在。适用于文本文件,但不适用于任何其他格式。我是否必须为此启用计费以使其持续工作?到目前为止,我是在免费配额内运行的。启用了计费,也没有任何区别。进行了一些额外的实验,当我上载一些.jpg文件时,下载部分发生,并在新的浏览器选项卡中显示部分图像,下载停止。直接签出云存储中的所有文件,能够无任何问题地访问它。这是系统中的错误吗?看起来我没有删除旧版本的app engine实例。我用上面的代码删除了当前文件并将其设置为默认值,现在我收到一个不同的文件错误,如.doc-error:Server error服务器遇到错误,无法完成您的请求。如果问题仍然存在,请报告您的问题,并说明此错误消息和导致此问题的查询。