【问题标题】:Serving an image from my war directory?从我的战争目录提供图像?
【发布时间】:2011-03-12 22:14:07
【问题描述】:

我有一个 servlet,它提供存储在 blob 中的图像文件。如果找不到请求的图像,我想提供一个包含在我的 war 目录中的静态图像。我们如何做到这一点?这就是我从数据存储中提供 blob 图像的方式:

public class ServletImg extends HttpServlet {
  public void doGet(HttpServletRequest req, HttpServletResponse resp)
  {
    MyImgWrapper obj = PMF.get().getPersistenceManager().
      getObjectById(MyImgWrapper.class, 'xyz');
    if (obj != null) {
      resp.getOutputStream().write(obj.getBlob().getBytes());
      resp.getOutputStream().flush();
    }
    else {
      // Here I'd like to serve an image from my war file. 
      /war/img/missingphoto.jpg
    } 
  }
}

是的,我只是不确定如何从我的战争目录中的图像中获取图像字节,或者是否有其他方法可以做到这一点?

谢谢

【问题讨论】:

    标签: java google-app-engine servlets


    【解决方案1】:

    推荐ClassLoader#getResourceAsStream() 的其他答案预计图像位于类路径。但是,您也可以使用 ServletContext#getResourceAsStream()webcontent 获取图像。 ServletContext 可通过继承的 getServletContext() 方法在 servlet 中使用。

    InputStream input = getServletContext().getResourceAsStream("/img/missingphoto.jpg");
    

    也就是说,完全读写byte[] 并不是真正的内存效率。考虑像这样通过一个小字节缓冲区(1~10KB)进行流式传输:

    input = getServletContext().getResourceAsStream(path);
    output = response.getOutputStream();
    byte[] buffer = new byte[1024];
    for (int length = 0; (length = input.read(buffer)) > 0;) {
        output.write(buffer, 0, length);
    }
    

    【讨论】:

    • 好吧,这很完美——我只是想知道 splix 的解决方案是否会提供更好的性能(http 重定向)?我猜浏览器必须发出另一个请求,所以总体上它会更慢?谢谢
    • 性能差异可以忽略不计。至少,重定向使得无法将响应状态设置为 404(在写入输出流之前调用 response.setStatus(HttpServletResponse.SC_NOT_FOUND);)。响应状态对搜索机器人等更有意义。
    【解决方案2】:

    关注哈瓦咖啡的tutorial

    Google 的第二个结果:java war file resource

    【讨论】:

    • 啊,这看起来像 Stroboskop 也推荐的,只是不确定资源的路径应该是什么?
    【解决方案3】:

    我建议你使用类加载器来检索文件。

    ClassLoader classLoader = this.getClass().getClassLoader();
    InputStream in = classLoader.getResourceAsStream(fileNameInClasspath);
    ...
    

    【讨论】:

    • 我怎么知道'fileNameInClasspath'应该是什么?图片路径为:[war/img/test.jpg]
    【解决方案4】:

    在这种情况下,更好的方法是简单地将 http 重定向(状态 301)返回到此图像的 URL。

    【讨论】:

      猜你喜欢
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多