专业的JAVA编程教程与资源

网站首页 > java教程 正文

SpringBoot 生成二维码(springboot生成图片)

temp10 2025-04-01 22:17:13 java教程 3 ℃ 0 评论

最近遇到一个需求:根据订单号生成支付二维码并提供访问链接。看起来简单,但其中的坑还是不少。为了让大家少踩雷,我用 SpringBoot+ZXing 给你完整捋一遍实现过程。

# 效果图

SpringBoot 生成二维码(springboot生成图片)


1. 配置好依赖

首先,生成二维码离不开一个工具库。这里我们用的是 ZXing,功能强大且易用。记得在 pom.xml 里加上下面的依赖:


    com.google.zxing
    javase
    3.3.0

版本注意事项:建议用最新稳定版,避免踩到版本兼容性的坑。


2. 编写工具类

工具类是重头戏,核心功能是生成二维码图片。我们写一个 QRCodeGenerator,方法分两步:编码内容、生成图片。

核心方法:generateQRCodeImage

这个方法负责生成二维码并保存为 PNG 图片。代码如下:

import com.google.zxing.*;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;

public class QRCodeGenerator {
    public static void generateQRCodeImage(String text, int width, int height, String filePath)
            throws WriterException, IOException {
        // 生成二维码矩阵
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);

        // 指定输出路径
        Path path = FileSystems.getDefault().getPath(filePath);

        // 将二维码写入文件
        MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
    }
}

代码说明

  1. **QRCodeWriter**:用来生成二维码矩阵。
  2. **MatrixToImageWriter**:将矩阵转化为图片并保存。
  3. 参数解析
  4. text:二维码包含的内容,比如支付链接。
  5. widthheight:二维码图片尺寸。
  6. filePath:保存路径。

测试一下,给个 “Hello World” 内容生成二维码:

public static void main(String[] args) {
    try {
        QRCodeGenerator.generateQRCodeImage("Hello World", 300, 300, "hello_world.png");
        System.out.println("二维码生成成功!");
    } catch (Exception e) {
        System.err.println("生成二维码失败:" + e.getMessage());
    }
}

运行完可以看到 hello_world.png,成品效果妥妥的。


3. Service 层实现

工具类搞定后,就轮到业务逻辑上场了。这里的需求是根据订单号生成支付二维码。

方法:qrcode

这个方法逻辑清晰:先拼接支付链接,再调用工具类生成二维码图片,最后返回访问地址。

import org.springframework.beans.factory.annotation.Value;

@RestController
@RequestMapping("/api")
public class QRCodeService {
    @Value("${file.upload.ip}")
    private String ip;

    @Value("${file.upload.path}")
    private String uploadPath;

    @GetMapping("/qrcode")
    public String qrcode(@RequestParam String orderNo, HttpServletRequest request) {
        try {
            // 拼接支付链接
            String address = ip + ":" + request.getLocalPort();
            String payUrl = "http://" + address + "/pay?orderNo=" + orderNo;

            // 生成二维码
            String filePath = uploadPath + orderNo + ".png";
            QRCodeGenerator.generateQRCodeImage(payUrl, 350, 350, filePath);

            // 返回二维码图片地址
            return "http://" + address + "/images-dev/" + orderNo + ".png";
        } catch (Exception e) {
            return "二维码生成失败:" + e.getMessage();
        }
    }
}

4. 参数配置

为了支持灵活的本地/线上调试,我们引入配置文件。比如:

# application.properties
file.upload.ip=127.0.0.1
file.upload.path=/var/uploads/

这样写的好处是,切换 IP 地址或上传目录的时候不用改代码,直接改配置就行。省事又优雅!


5. 启动验证

一切搞定,启动项目试试:

  1. 打开浏览器访问:http://127.0.0.1:8080/api/qrcode?orderNo=123456
  2. 成功的话会返回类似:http://127.0.0.1:8080/images-dev/123456.png

6. 常见问题 & 优化建议

问题 1:路径找不到

图片保存路径 uploadPath 一定要存在,否则生成会报错。可以在项目启动时检查目录是否存在:

File dir = new File(uploadPath);
if (!dir.exists()) {
    dir.mkdirs();
}

问题 2:二维码内容不够多样化

除了支付链接,你可以拓展生成带 Logo 的二维码。这需要先合并二维码图片和 Logo 图片,可以用 Java 图像处理库如 BufferedImage

问题 3:局域网访问失败

如果本机是局域网环境,可以通过 InetAddress 获取内网 IP:

InetAddress localHost = InetAddress.getLocalHost();
String ip = localHost.getHostAddress();

小结

二维码生成功能虽然简单,但处理细节时一点都不能马虎。像路径、配置、兼容性等问题,如果不注意就很容易踩坑。希望这份教程能帮到大家,码农的快乐,有时候就来自这些小工具!

你有更好的实现方法吗?评论区交个朋友吧!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表