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日

相关文章

  • Java之经典排序算法

    Java之经典排序算法 本文将详细讲解 Java 中常见的经典排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序和堆排序等七种算法,并给出示例代码。 冒泡排序 冒泡排序是最简单的排序算法之一,基本思想是将相邻的元素两两比较,如果前一个元素比后一个元素大,就将它们两者交换位置。重复这个过程,直到整个序列有序为止。 下面是 Java 实现代…

    Java 2023年5月19日
    00
  • Java内存溢出的原因是什么?

    下面是详细讲解 Java 内存溢出的原因和解决方案的使用攻略。 什么是 Java 内存溢出? Java 内存溢出是指在 Java 应用程序中,当程序需要更多的内存空间时,系统无法分配足够的内存空间,导致程序崩溃的问题。Java 内存溢出通常是由于应用程序中存在内存泄漏或者大量占用内存的对象导致的。 Java 内存溢出的原因是什么? Java 内存溢出的原因主…

    Java 2023年5月11日
    00
  • javaMybatis映射属性,高级映射详解

    Java Mybatis 映射属性,高级映射详解 概述 在 Java Mybatis 中, 映射属性是指将 Java 对象映射到数据库表的字段上。Mybatis 提供了多种映射方式,这篇攻略主要介绍 Mybatis 映射属性的基本用法和高级映射。 基本映射 在 Mybatis 的 mapper 文件中,我们可以使用 resultMap 标签来对返回对象进行映…

    Java 2023年6月1日
    00
  • 整理Javascript基础语法学习笔记

    下面是“整理Javascript基础语法学习笔记”的完整攻略: 第一步:细心阅读学习笔记 首先,要认真阅读你的Javascript基础语法学习笔记,将各部分的知识点和代码实例整理出来,并归类到一个个章节中。可以采取在每个标题下面加上摘要或者关键词的方式来进行梳理,帮助自己更好的理解和记忆。 比如下面这个关于变量声明的小节,可以采用这样的方式来整理笔记: 变量…

    Java 2023年5月26日
    00
  • IntelliJ中高效重构的10个快捷方式详解

    当谈到Java编程的时候,IntelliJ IDEA是程序员们的首选。IntelliJ IDEA是一款IDE,它是由JetBrains公司开发的一种Java集成开发环境。本文将介绍IntelliJ IDEA中的10个高效重构快捷方式,它们将帮助您在重构代码时更快、更高效地完成工作。 1. Rename(重命名) “Rename”(重命名)是一种在Intell…

    Java 2023年5月26日
    00
  • java随机生成一个名字和对应拼音的方法

    生成随机名字可以借助汉字Unicode编码和Java随机数生成器。具体步骤如下: 1.确定姓氏。由于汉字Unicode编码中,姓氏范围为0x4E00至0x9FA5,因此可以使用Java随机数生成器生成一个在该范围内的随机数,再通过该随机数获取对应的汉字作为姓氏。 示例代码: Random rand = new Random(); // 区间的左闭右开区间,范…

    Java 2023年6月15日
    00
  • java注解处理器学习在编译期修改语法树教程

    下面是一份关于“java注解处理器学习在编译期修改语法树教程”的详细攻略: 什么是Java注解处理器? Java注解处理器原指可以处理Java源代码中的注解,并且它们在编译期间运行。它们提供了一种利用注解来完成某些类似于AOP(面向切面编程)的操作的方式。 Java注解处理器是一个编译器的插件,可以在代码编译过程中自动运行,并且可以添加、计算或删除代码。 编…

    Java 2023年5月20日
    00
  • SpringBoot快速入门详解

    Spring Boot快速入门详解 Spring Boot是一个基于Spring框架的快速开发应用程序的工具。它提供了一种快速、便捷的方式来创建基于Spring的应用程序,同时也提供了一些默认的和约定,使得开发人员可以更加专注于业务逻辑的实现。本文将详细讲解如何使用Spring Boot快速入门,并提供两个示例。 1. 创建Spring Boot应用程序 首…

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