Bal*_*usC 23
为了获得最佳性能和效率,请不要将整个内容放入byte[]
.每个人byte
都吃,就是来自Java内存的一个字节.想象一下,100个并发用户请求每100KB的10张图像,这已经消耗掉了100MB的Java内存.
InputStream
从数据库中获取映像ResultSet#getBinaryStream()
,将其包装并将其BufferedInputStream
写入通过小缓冲区OutputStream
包装的响应中.BufferedOutputStream
byte[]
假设您按数据库键选择图像作为标识符,请在HTML中使用:
<img src="images/123">
Run Code Online (Sandbox Code Playgroud)
创建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) {}
}
Run Code Online (Sandbox Code Playgroud)
在ImageDAO#find()
您可以使用从数据库中ResultSet#getBinaryStream()
获取图像InputStream
.
归档时间: |
|
查看次数: |
31340 次 |
最近记录: |