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



