我正在使用HttpServer
和HttpHandler
开发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字节的数据。
答案 0 :(得分:11)
你在这里做了太多工作:解码图像,并将其存储在内存中。您不应该尝试将文件作为图像读取。那没用。浏览器的所有需求都是图像文件中的字节数。所以你应该按原样发送图像文件中的字节:
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();
答案 1 :(得分:0)
DataBufferByte
将其数据存储在银行中。 getData()
仅检索第一个银行,因此您只声明第一个银行的长度,然后只写第一个银行。
而不是当前的写行,请改为尝试(未经测试):
arg0.sendResponseHeaders(200, data.getDataTypeSize(TYPE_BYTE));
OutputStream outputStream=arg0.getResponseBody();
for (byte[] dataBank : data.getBankData()) {
outputStream.write(dataBank);
}
outputStream.close