在 Servlet 中动态生成图片
前面在文件下载中,我们通过读取服务器上的文件并以流的方式返回给浏览器。实际上,完全可以在 Servlet 中直接使用 Graphics2D 等对象动态生成一张图片,然后直接输出到客户端。需要注意的是,这种方式生成的图片内容有限,不能生成复杂的风景图片等。
注意:代码中需要引入
java.awt.Color包,不要引错。
动态生成图片示例(验证码/二维码)
以下代码演示在内存中创建一张图片,绘制随机数字,并以图片形式返回给浏览器:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setHeader("refresh", "5"); // 设置refresh响应头控制浏览器每隔5秒钟刷新一次
// 1.在内存中创建一张图片
BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
// 2.得到图片的绘图对象
Graphics2D g = (Graphics2D) image.getGraphics();
g.setColor(Color.WHITE); // 设置图片的背景色
g.fillRect(0, 0, 80, 20); // 填充背景色
// 3.向图片上写数据
g.setColor(Color.BLUE); // 设置图片上字体的颜色
g.setFont(new Font(null, Font.BOLD, 20));
g.drawString(makeNum(), 0, 20);
// 4.设置响应头控制浏览器以图片的方式打开
response.setContentType("image/jpeg"); // 等同于response.setHeader("Content-Type", "image/jpeg");
// 5.设置响应头控制浏览器不缓存图片数据
response.setDateHeader("expries", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
// 6.将图片写给浏览器
ImageIO.write(image, "jpg", response.getOutputStream());
}
/**
* 生成随机数字
* @return
*/
private String makeNum() {
Random random = new Random();
String num = random.nextInt(9999999) + "";
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 7 - num.length(); i++) {
sb.append("0");
}
num = sb.toString() + num;
return num;
}Code language: JavaScript (javascript)
关键点说明
| 步骤 | 说明 |
|---|---|
BufferedImage | 在内存中创建图片缓冲区 |
Graphics2D | 获取绘图对象,用于绘制背景、文字等 |
response.setContentType("image/jpeg") | 告诉浏览器返回的是图片数据 |
| 禁用缓存头 | 确保每次请求都生成新图片,避免浏览器使用缓存 |
ImageIO.write() | 将内存中的图片通过 OutputStream 输出到客户端 |
读者可以自行尝试运行上述代码,访问该 Servlet 时会看到每隔 5 秒刷新一次的随机数字图片。
Previous: 文件下载