下面我来详细讲解如何使用springboot和hutool批量生成二维码压缩导出功能:
环境准备
- JDK 1.8或以上版本
- Maven
- IDE(推荐使用IntelliJ IDEA)
生成二维码
- 首先在pom.xml中添加依赖(注意版本号):
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.4.1</version>
</dependency>
- 创建一个Util类,用于生成二维码,代码如下:
import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import com.google.zxing.EncodeHintType;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Hashtable;
public class QrCodeUtils {
/**
* 生成二维码
* @param content 二维码内容
* @param width 宽度
* @param height 高度
* @param logoFile 二维码中间的logo文件
* @return BufferedImage
*/
public static BufferedImage generateQrCode(String content, int width, int height, File logoFile) {
Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.MARGIN, 1);
BufferedImage image = QrCodeUtil.generate(content, width, height, logoFile, hints);
return image;
}
/**
* 生成二维码文件
* @param content 二维码内容
* @param width 宽度
* @param height 高度
* @param outputFile 生成的二维码文件
* @param logoFile 二维码中间的logo文件
*/
public static void generateQrCodeFile(String content, int width, int height, File outputFile, File logoFile) {
BufferedImage image = generateQrCode(content, width, height, logoFile);
// 生成二维码
QrCodeUtil.writeToFile(image, FileUtil.extName(outputFile), outputFile);
}
}
- 在controller中调用生成二维码方法:
@RequestMapping("/qrcode")
public void generateQrCode() {
// 二维码内容
String content = "https://www.example.com";
// 二维码宽度
int width = 300;
// 二维码高度
int height = 300;
// 生成二维码
BufferedImage image = QrCodeUtils.generateQrCode(content, width, height, null);
// 输出到浏览器
response.setContentType("image/png");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
try {
ImageIO.write(image, "PNG", response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
批量生成二维码并压缩导出
- 首先在pom.xml中添加相关依赖(注意版本号):
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.0</version>
</dependency>
- 创建一个Util类,用于批量生成二维码并压缩导出:
import cn.hutool.core.io.resource.ClassPathResource;
import cn.hutool.core.util.ZipUtil;
import com.google.gson.GsonBuilder;
import org.apache.commons.io.filefilter.SuffixFileFilter;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
public class BatchQrCodeUtils {
/**
* 批量生成二维码文件
* @param contents 二维码内容列表
* @param width 二维码宽度
* @param height 二维码高度
* @param outputDir 二维码输出目录
*/
public static List<File> batchGenerateQrCodeFile(List<String> contents, int width, int height, File outputDir) {
List<File> fileList = new ArrayList<>();
for (int i = 0; i < contents.size(); i++) {
String content = contents.get(i);
File outputFile = new File(outputDir, UUID.randomUUID().toString() + ".png");
QrCodeUtils.generateQrCodeFile(content, width, height, outputFile, null);
fileList.add(outputFile);
}
return fileList;
}
/**
* 压缩文件并导出
* @param fileList 需要压缩的文件列表
* @param zipFileName 压缩文件名
* @param response HTTP响应
*/
public static void compressAndDownload(List<File> fileList, String zipFileName, HttpServletResponse response) throws IOException {
// 创建临时目录
String tempDir = System.getProperty("java.io.tmpdir") + File.separator + UUID.randomUUID().toString();
File tempDirFile = new File(tempDir);
tempDirFile.mkdir();
// 将文件复制到临时目录
for (File file : fileList) {
File tempFile = new File(tempDirFile, file.getName());
org.apache.commons.io.FileUtils.copyFile(file, tempFile);
}
// 压缩文件
File zipFile = new File(tempDirFile, zipFileName + ".zip");
ZipUtil.zip(tempDirFile.getAbsolutePath(), zipFile.getAbsolutePath());
// 设置HTTP响应头
// 注意:content-disposition的filename需要进行URL编码,否则会出现中文乱码
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition", "attachment; filename=\"" + java.net.URLEncoder.encode(zipFileName + ".zip", "UTF-8") + "\"");
ServletOutputStream outputStream = response.getOutputStream();
InputStream inputStream = new FileInputStream(zipFile);
byte[] bytes = new byte[2048];
int length;
while ((length = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, length);
}
outputStream.flush();
outputStream.close();
// 删除临时文件
org.apache.commons.io.FileUtils.deleteQuietly(zipFile);
org.apache.commons.io.FileUtils.deleteQuietly(tempDirFile);
}
/**
* 批量生成二维码并压缩导出
* @param contents 二维码内容列表
* @return boolean
*/
public static void batchGenerateQrCodeAndCompress(List<String> contents, HttpServletResponse response) throws IOException {
int width = 300;
int height = 300;
// 批量生成二维码文件
String fileNamePrefix = "qrcode";
File outputDir = new File(System.getProperty("java.io.tmpdir") + File.separator + UUID.randomUUID().toString());
outputDir.mkdir();
List<File> fileList = batchGenerateQrCodeFile(contents, width, height, outputDir);
// 压缩文件并导出
String zipFileName = fileNamePrefix + "_" + System.currentTimeMillis();
compressAndDownload(fileList, zipFileName, response);
}
}
- 在Controller中调用批量生成二维码和压缩导出方法:
@RequestMapping("/batch")
public void batchQrCode() {
List<String> contents = new ArrayList<>();
contents.add("https://www.example1.com");
contents.add("https://www.example2.com");
try {
BatchQrCodeUtils.batchGenerateQrCodeAndCompress(contents, response);
} catch (IOException e) {
e.printStackTrace();
}
}
至此,整个“springboot+hutool批量生成二维码压缩导出功能”的攻略就完成了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot+hutool批量生成二维码压缩导出功能 - Python技术站