我正在尝试使用servlet输出图像。这是我的代码:
@WebServlet(name = "PhoneImageServlet", urlPatterns = {"/image/phone"})
public class PhoneImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try (InputStream in = getClass().getClassLoader().getResourceAsStream("/images/phone.png");
BufferedReader br = new BufferedReader(new InputStreamReader(in));
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream())) {
response.setContentType("image/png");
int ch=0;
while ((ch=br.read()) != -1) {
out.write(ch);
}
}
}
}
但是当我尝试使用浏览器打开图片时,这是结果: enter image description here
你知道这是什么问题吗?
顺便说一下,如果我在硬盘中使用绝对URL来映像,代码就可以工作。将图像移动到.war文件时,问题就开始了。
---------------------- edit ----------------------- < / p>
我根据Stephen C的回答更改了我的代码,现在可以使用了!
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("image/png");
try (InputStream is = getClass().getClassLoader().getResourceAsStream("/images/phone.png");
BufferedInputStream in = new BufferedInputStream(is);
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream())) {
byte[] buffer = new byte[1024];
while ((in.read(buffer)) != -1) {
out.write(buffer);
}
}
}
答案 0 :(得分:3)
图像是二进制数据。但是你从资源中读取它作为字符。然后你将这些字符写为字节。结果是你正在破坏图像。
以字节形式读取。写为字节。
请勿使用BufferedReader
或InputStreamReader
。
改为使用BufferedInputStream
。
第二个问题是,在致电response.setContentType("image/png")
之前,您需要致电response.getOutputStream()
。通过输出响应头来调用getOutputStream() or
getWriter()`“提交”响应。提交响应后对标题(例如内容类型)的更改无效。