springboot+hutool批量生成二维码压缩导出功能

下面我来详细讲解如何使用springboot和hutool批量生成二维码压缩导出功能:

环境准备

  • JDK 1.8或以上版本
  • Maven
  • IDE(推荐使用IntelliJ IDEA)

生成二维码

  1. 首先在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>
  1. 创建一个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);
    }
}
  1. 在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();
    }
}

批量生成二维码并压缩导出

  1. 首先在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>
  1. 创建一个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);
    }

}
  1. 在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技术站

(1)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Spring Security 自定义资源服务器实践过程

    下面我为你详细讲解“Spring Security 自定义资源服务器实践过程”的完整攻略。 前言 Spring Security 是一款非常流行的安全框架,可以帮助我们管理应用程序中的用户认证、授权、攻击防护等方面的安全问题。其中,Spring Security 的资源服务器模块可以帮助我们提供对受保护资源的安全访问控制机制,本文就是围绕如何自定义资源服务器…

    Java 2023年6月3日
    00
  • Java中统计字符个数以及反序非相同字符的方法详解

    Java中统计字符个数的方法详解 在Java中可以使用几种方法来统计字符串中字符的个数,下面介绍一些常用的方法。 1.使用for循环 可以使用for循环遍历字符串,逐个判断字符是否相同或满足某些条件,从而统计字符个数。 示例代码: public int countChar(String str, char c) { int count = 0; for (i…

    Java 2023年5月27日
    00
  • 如何把spring boot项目部署到tomcat容器中

    下面是如何把Spring Boot项目部署到Tomcat容器中的完整攻略。 1. 修改pom.xml文件 在pom.xml文件中添加如下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-sta…

    Java 2023年5月19日
    00
  • java使用jar包生成二维码的示例代码

    下面是Java使用jar包生成二维码的完整攻略: 1. 引入Jar包 在Java中使用二维码需要引入第三方Jar包,可以使用Zxing或者QrCode这两个常用的Jar包。这里以Zxing为例,可以从官网或者Maven库中下载获取。 2. 生成二维码 import java.awt.Color; import java.awt.Graphics2D; imp…

    Java 2023年5月20日
    00
  • Java编译时类型与运行时类型

    Java编译时类型与运行时类型 Java编译时类型与运行时类型是Java中非常重要的概念。在Java程序运行过程中,一个实例对象在编译时和运行时可能拥有不同的类型。下面我们来详细了解一下Java编译时类型与运行时类型。 什么是编译时类型 编译时类型指的是被声明的类型。在Java程序编译阶段,Java编译器会根据变量声明的类型对变量进行类型检查,这个被检查的类…

    Java 2023年5月26日
    00
  • Idea如何导入一个SpringBoot项目的方法(图文教程)

    下面我将详细讲解Idea如何导入一个SpringBoot项目的方法。 1. 创建SpringBoot项目 首先,我们需要创建一个SpringBoot项目,这里以使用Spring Initializr来创建为例。打开https://start.spring.io/,根据需求选择相应的配置,然后点击Generate下载生成的项目压缩包。解压后我们就得到了一个基本…

    Java 2023年5月19日
    00
  • Java编程调用微信分享功能示例

    下面将详细讲解“Java编程调用微信分享功能示例”的完整攻略。 准备工作 1.获取微信开发者账号 要调用微信分享功能,首先需要先去微信公众平台申请开发者账号。 2.注册开发者账户 如果你还没有微信公众平台的账号,请先注册账户并绑定一个公众号。 3.开通JS接口权限 在微信公众平台中,需要先开通JS接口权限,该权限可以开启微信的网页开发能力,包括调用微信分享功…

    Java 2023年5月26日
    00
  • Java面试经验+最新BAT面试资料分享给大家(小结)

    Java面试经验+最新BAT面试资料分享给大家(小结) 这篇文章将帮助大家准备BAT公司的Java面试,希望对大家有所帮助。 程序员面试的模式 程序员面试一般分为以下几轮: 简历筛选 笔试 技术面试 综合素质面试 HR面试 针对每一轮面试,我们都需要做好充足的准备。 简历筛选 在简历筛选阶段,我们需要注意以下几个点: 简历的格式需要清晰简洁,突出重点 突出自…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部