我正在以最佳性能将图像写入servlet响应。有什么建议,做法和经验吗?
为了获得最佳性能和效率,请勿将全部内容放入byte[]。byte是的,每个都吃掉Java内存中的一个字节。想象有100个并发用户,每个100KB请求10张图像,这已经消耗了100MB Java内存。
byte[]
byte
InputStream使用DB从中获取图像ResultSet#getBinaryStream(),将其包装在中,BufferedInputStream然后将其写入通过小缓冲区OutputStream包装在响应中。BufferedOutputStream``byte[]
InputStream
ResultSet#getBinaryStream()
BufferedInputStream
OutputStream
BufferedOutputStream``byte[]
假设您通过数据库键选择图像作为标识符,请在HTML中使用它:
<img src="images/123">
创建Servlet其在映射类web.xml上url-pattern的/images/*并执行其doGet()方法如下:
Servlet
web.xml
url-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。
ImageDAO#find()