Java生成二维码嵌入HTML模板发邮件(无需保存至磁盘)
解决方案
当然可以不用将二维码保存到磁盘,直接把它转成Base64编码的Data URI嵌入HTML的<img>标签里,具体实现如下:
核心思路
把生成的二维码BufferedImage写入字节输出流,再将字节数组转换为Base64字符串,最后拼接成data:image/png;base64,xxx格式的Data URI,直接作为<img>标签的src属性值即可。
修改后的代码
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Base64; import com.google.zxing.BarcodeFormat; import com.google.zxing.WriterException; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.qrcode.QRCodeWriter; import javax.imageio.ImageIO; public String generateQrCodeAsDataUri(String content) { try { QRCodeWriter qrCodeWriter = new QRCodeWriter(); // 生成二维码矩阵 var bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, 450, 450); // 转换为BufferedImage var bfi = MatrixToImageWriter.toBufferedImage(bitMatrix); // 写入字节输出流,避免磁盘存储 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(bfi, "PNG", baos); // 字节数组转Base64字符串 byte[] qrBytes = baos.toByteArray(); String base64Qr = Base64.getEncoder().encodeToString(qrBytes); // 拼接成Data URI格式,直接用于img的src return "data:image/png;base64," + base64Qr; } catch (IOException | WriterException e) { throw new RuntimeException(e); } }
HTML模板中的使用方式
将上述方法返回的字符串直接赋值给<img>的src属性即可:
<img src="${qrCodeDataUri}" alt="二维码">
注意事项
- 绝大多数主流邮件客户端都支持Data URI,但极少数老旧客户端可能存在兼容问题;如果需要覆盖所有场景,可考虑邮件附件+CID引用方案,但Data URI是更贴合你需求的无磁盘方案。
- Base64编码会让数据体积增加约30%,但450x450尺寸的PNG二维码转码后体积不大,完全在邮件内容的合理范围内。
内容的提问来源于stack exchange,提问作者Boots
相关产品推荐
相关产品推荐

