【问题标题】:Google App Engine for Java and Google Cloud Storage适用于 Java 的 Google App Engine 和 Google Cloud Storage
【发布时间】:2012-06-03 23:05:46
【问题描述】:

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

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

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

下面的代码sn-p,

         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();
         }

【问题讨论】:

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


    【解决方案1】:

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

    类似

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

    【讨论】:

    • 谢谢 很想尝试此修复,但 Eclipse 为 createGsBlobKey 方法抛出语法错误 - “方法 createGsBlobKey(String) 未定义 BlobstoreService 类型”。我正在使用 AppEngine SDK 1.6.3。
    • 升级到 1.6.6。问题仍然存在,在本地环境中运行良好,但是当我部署到服务器时,问题仍然存在。适用于文本文件,但不适用于任何其他格式。我是否必须启用计费才能使其始终如一地工作?到目前为止,我在免费配额内运营。
    • 也启用了计费,没有任何区别
    • 尝试了一些额外的实验,当我上传一些 .jpg 文件时,下载部分发生,并且在新的浏览器选项卡中部分显示图像并停止下载。直接检查了云存储中的所有文件,可以毫无问题地访问它。这是系统的BUG吗?
    • 看来我还没有删除旧版本的应用引擎实例。我用上面的代码删除了当前一个并将其设置为默认值,现在我得到了一个不同的错误,比如 .doc - 错误:服务器错误服务器遇到错误,无法完成您的请求。如果问题仍然存在,请报告您的问题并提及此错误消息和导致它的查询。
    【解决方案2】:

    您将尝试以下语句顺序。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-14
      • 2015-07-07
      • 2014-03-22
      • 2015-05-14
      • 1970-01-01
      • 2014-01-16
      • 2011-12-25
      • 1970-01-01
      相关资源
      最近更新 更多