Serving an image from my war directory?

2019-07-13 05:08发布

I have a servlet which serves an image file which was stored in a blob. If the requested image can't be found, I'd like to server a static image I have included in my war directory. How do we do this? This is how I'm serving the blob images from the datastore:

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
    } 
  }
}

yeah I'm just not sure how to get the image bytes from the image in my war dir, or if there's some other way to do it?

Thanks

4条回答
可以哭但决不认输i
2楼-- · 2019-07-13 05:47

I suggest you use the class loader to retrieve the file.

ClassLoader classLoader = this.getClass().getClassLoader();
InputStream in = classLoader.getResourceAsStream(fileNameInClasspath);
...
查看更多
老娘就宠你
3楼-- · 2019-07-13 05:54

Follow Haveacafe's tutorial.

2nd result for Google: java war file resource.

查看更多
别忘想泡老子
4楼-- · 2019-07-13 05:54

Better way at this case will be simply return http redirect (status 301) to URL of this image.

查看更多
我只想做你的唯一
5楼-- · 2019-07-13 06:13

The other answers recommending ClassLoader#getResourceAsStream() are expecting that the image is located in the classpath. You can however also obtain the image from the webcontent using ServletContext#getResourceAsStream(). The ServletContext is available in servlets by the inherited getServletContext() method.

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

That said, reading and writing fully into/from a byte[] is not really memory efficient. Consider streaming through a small byte buffer (1~10KB) like so:

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);
}
查看更多
登录 后发表回答