Bal*_*usC 23
为了获得最佳性能和效率,请不要将整个内容放入byte[].每个人byte都吃,就是来自Java内存的一个字节.想象一下,100个并发用户请求每100KB的10张图像,这已经消耗掉了100MB的Java内存.
InputStream从数据库中获取映像ResultSet#getBinaryStream(),将其包装并将其BufferedInputStream写入通过小缓冲区OutputStream包装的响应中.BufferedOutputStreambyte[]
假设您按数据库键选择图像作为标识符,请在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 次 |
| 最近记录: |