【问题标题】:Image from servlet cant be opened with browser来自servlet的图像无法用浏览器打开
【发布时间】:2017-10-21 21:09:45
【问题描述】:

我正在尝试使用 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 文件时,问题就开始了。

---------- 编辑 -----------

我根据 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);
            }
        }
    }

【问题讨论】:

    标签: java http servlets stream


    【解决方案1】:

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

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

    不要使用BufferedReaderInputStreamReader

    请改用BufferedInputStream


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

    【讨论】:

      猜你喜欢
      • 2018-03-10
      • 2017-07-13
      • 2015-12-11
      • 2023-01-04
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多