小编典典

以最佳性能将图像写入servlet响应

java

我正在以最佳性能将图像写入servlet响应。有什么建议,做法和经验吗?


阅读 217

收藏
2020-09-11

共1个答案

小编典典

为了获得最佳性能和效率,请勿将全部内容放入byte[]byte是的,每个都吃掉Java内存中的一个字节。想象有100个并发用户,每个100KB请求10张图像,这已经消耗了100MB
Java内存。

InputStream使用DB从中获取图像ResultSet#getBinaryStream(),将其包装在中,BufferedInputStream然后将其写入通过小缓冲区OutputStream包装在响应中。BufferedOutputStream``byte[]

假设您通过数据库键选择图像作为标识符,请在HTML中使用它:

<img src="images/123">

创建Servlet其在映射类web.xmlurl-pattern/images/*并执行其doGet()方法如下:

Long imageId = Long.valueOf(request.getPathInfo().substring(1)); // 123
Image image = imageDAO.find(imageId); // Get Image from DB.
// Image class is just a Javabean with the following properties:
// private String filename;
// private Long length;
// private InputStream content;

response.setHeader("Content-Type", getServletContext().getMimeType(image.getFilename()));
response.setHeader("Content-Length", String.valueOf(image.getLength()));
response.setHeader("Content-Disposition", "inline; filename=\"" + image.getFilename() + "\"");

BufferedInputStream input = null;
BufferedOutputStream output = null;

try {
    input = new BufferedInputStream(image.getContent());
    output = new BufferedOutputStream(response.getOutputStream());
    byte[] buffer = new byte[8192];
    for (int length = 0; (length = input.read(buffer)) > 0) {
        output.write(buffer, 0, length);
    }
} finally {
    if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
    if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
}

在中,ImageDAO#find()您可以用来从数据库中ResultSet#getBinaryStream()获取图像InputStream

2020-09-11