从我的战争目录中提供图像?

时间:2010-07-07 16:23:52

标签: java google-app-engine servlets

我有一个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
    } 
  }
}
是的,我只是不确定如何从我的战争目录中的图像中获取图像字节,或者是否有其他方法可以做到这一点?

由于

4 个答案:

答案 0 :(得分:3)

推荐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);
}

答案 1 :(得分:1)

关注Haveacafe的tutorial

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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