来自servlet的图像无法通过浏览器打开

时间:2017-05-22 09:10:48

标签: java http servlets stream

我正在尝试使用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);
            }
        }
    }

1 个答案:

答案 0 :(得分:3)

图像是二进制数据。但是你从资源中读取它作为字符。然后你将这些字符写为字节。结果是你正在破坏图像。

以字节形式读取。写为字节。

请勿使用BufferedReaderInputStreamReader

改为使用BufferedInputStream

第二个问题是,在致电response.setContentType("image/png")之前,您需要致电response.getOutputStream()。通过输出响应头来调用getOutputStream() or getWriter()`“提交”响应。提交响应后对标题(例如内容类型)的更改无效。