如何通过Java HTTP服务器发送图像

7
我正在使用 HttpServerHttpHandler 开发一个HTTP服务器。该服务器应该能够向客户端响应XML数据或图像。
到目前为止,我已经开发了一些 HttpHandler 实现来响应客户端的XML数据,但是我无法实现一个从文件读取图像并将其发送给客户端(例如浏览器)的 HttpHandler
图片不应该完全加载到内存中,所以我需要一种流式解决方案。
public class ImagesHandler implements HttpHandler {
    @Override
    public void handle(HttpExchange arg0) throws IOException {
        File file=new File("/root/images/test.gif");
        BufferedImage bufferedImage=ImageIO.read(file);

        WritableRaster writableRaster=bufferedImage.getRaster();
        DataBufferByte data=(DataBufferByte) writableRaster.getDataBuffer();

        arg0.sendResponseHeaders(200, data.getData().length);
        OutputStream outputStream=arg0.getResponseBody();
        outputStream.write(data.getData());
        outputStream.close();
    }
}

这段代码只是向浏览器发送了512字节的数据。
2个回答

12

你在这里做了太多的工作:解码图像并将其存储在内存中。你不应该尝试将文件读取为图像。那是无用的。浏览器只需要图像文件中的字节。因此,你应该直接发送图像文件中的字节:

File file = new File("/root/images/test.gif");
arg0.sendResponseHeaders(200, file.length());
// TODO set the Content-Type header to image/gif 

OutputStream outputStream=arg0.getResponseBody();
Files.copy(file.toPath(), outputStream);
outputStream.close();

通过这个,图片已经在浏览器上下载了。如果我需要在浏览器中显示图片(有点像使用<img>标签),该怎么办? - Harsh Chiki
@HarshChiki <img src="/路径/到/允许下载图片的Servlet或处理程序或操作的路径" /> - JB Nizet

0

DataBufferByte将其数据存储在银行中。getData()仅检索第一个银行,因此您声明了仅第一个银行的长度,然后仅写入第一个银行。

请尝试使用以下代码替换当前的写入行(未经测试):

arg0.sendResponseHeaders(200, data.getDataTypeSize(TYPE_BYTE));
OutputStream outputStream=arg0.getResponseBody();
for (byte[] dataBank : data.getBankData()) {
  outputStream.write(dataBank);
}
outputStream.close

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接