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