基础环境
SpringBoot、Maven
这里是使用了Hutool 的二维码生成工具类
二维码的生成基础,都是zxing包,这是Google开源的一个包
考虑到自行实现的难度,因此Hutool针对被广泛接受的的zxing库进行封装。
这里采用Hutool的方式实现
Hutool的是非强制依赖性,因此zxing需要用户自行引入,我们需要加入依赖。使用hutool的时候,com.google.zxing-javase的依赖可以不需要。
<!-- 二维码支持包 -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
QrCodeUtil 提供了几种生成方法
/**
* 生成二维码到文件,二维码图片格式取决于文件的扩展名
*
* @param content 文本内容
* @param width 宽度
* @param height 高度
* @param targetFile 目标文件,扩展名决定输出格式
* @return 目标文件
*/
public static File generate(String content, int width, int height, File targetFile) {
final BufferedImage image = generate(content, width, height);
ImgUtil.write(image, targetFile);
return targetFile;
}
/**
* 生成二维码到文件,二维码图片格式取决于文件的扩展名
*
* @param content 文本内容
* @param config 二维码配置,包括长、宽、边距、颜色等
* @param targetFile 目标文件,扩展名决定输出格式
* @return 目标文件
* @since 4.1.2
*/
public static File generate(String content, QrConfig config, File targetFile) {
final BufferedImage image = generate(content, config);
ImgUtil.write(image, targetFile);
return targetFile;
}
/**
* 生成二维码到输出流
*
* @param content 文本内容
* @param width 宽度
* @param height 高度
* @param imageType 图片类型(图片扩展名),见{@link ImgUtil}
* @param out 目标流
*/
public static void generate(String content, int width, int height, String imageType, OutputStream out) {
final BufferedImage image = generate(content, width, height);
ImgUtil.write(image, imageType, out);
}
/**
* 生成二维码到输出流
*
* @param content 文本内容
* @param config 二维码配置,包括长、宽、边距、颜色等
* @param imageType 图片类型(图片扩展名),见{@link ImgUtil}
* @param out 目标流
* @since 4.1.2
*/
public static void generate(String content, QrConfig config, String imageType, OutputStream out) {
final BufferedImage image = generate(content, config);
ImgUtil.write(image, imageType, out);
}
这里封装了工具类使 QrCodeUtil 更加满足项目的需求
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.qrcode.QrCodeException;
import cn.hutool.extra.qrcode.QrCodeUtil;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.IOException;
@Slf4j
public class QrcodeUtil {
private static final int WIDTH = 300;
private static final int HEIGHT = 300;
private static final String TYPE = ".png";
/**
* 生成二维码到文件,二维码图片格式取决于文件的扩展名
*
* @param content 内容
* @param filePath 目标文件地址
* @return MultipartFile
*/
public static File createQrCodeToFile(String content, String filePath) {
//拼接uuid,防止在高并发情况下,出现文件名重复的情况
String fileName = IdUtil.simpleUUID() + TYPE;
File dest = null;
try {
// 返回此抽象路径名的规范形式
dest = new File(filePath + fileName).getCanonicalFile();
} catch (IOException e) {
e.printStackTrace();
}
File file = null;
try {
// 生二维码到文件
file = QrCodeUtil.generate(content, WIDTH, HEIGHT, dest);
log.info(StrUtil.format("生成二维码成功, 位置在:{}!", dest));
} catch (QrCodeException e) {
log.error("发生错误! {}!", e.getMessage());
}
return file;
}
在配置文件中设置文件生成路径
# 文件存储路径
file:
path: ./upload/
# 文件大小 /M
maxSize: 100
avatarMaxSize: 5
得到文件名返回给前端
@Slf4j
@Service
@RequiredArgsConstructor
public class QRCodeService {
private final FileProperties fileProperties;
public String getQRCode(String codeContent) {
try {
File file = QrcodeUtil.createQrCodeToFile(questionnaireProcessDTO.getLink(), fileProperties.getPath());
log.info("成功生成二维码!");
} catch (Exception e) {
log.error("发生错误, 错误信息是:{}!", e.getMessage());
}
return file.getName();
}
}