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中的println输入和toString方法的重写问题

    下面是详解Java中的println输入和toString方法的重写问题的完整攻略。 一、概述 在Java中,我们经常需要输出字符串以便于调试代码、观察程序运行逻辑等。此时,Java提供的println方法就非常方便,我们可以通过System.out.println()将信息输出到控制台。不过,在输出对象时,可能会遇到一些问题,比如输出的信息不够明确、可读性…

    Java 2023年5月26日
    00
  • Ext javascript建立超链接,进行事件处理的实现方法

    下面是关于在 ExtJS 中建立超链接并进行事件处理的实现方法的攻略。 1. 建立超链接 要在 ExtJS 中建立超链接,可以使用 Ext.dom.Element 类的 setHtml 方法。此方法可以设置元素的 innerHTML 属性,因此可以通过设置一个包含超链接代码的字符串来建立超链接。 例如,下面的代码使用 setHtml 方法建立一个包含超链接的…

    Java 2023年6月15日
    00
  • Java毕业设计实战之食品溯源系统的实现

    Java毕业设计实战之食品溯源系统的实现 总体方案设计 食品溯源系统是一个涉及到供应链的系统,其主要功能是通过一系列的技术手段,让消费者了解所消费的食品的生产、加工、运输等各个环节的信息,保证消费者的健康和权益。因此,食品溯源系统的主要模块有:数据录入模块,数据存储模块,数据查询模块,数据展示模块等。 在本项目中,我们采用的技术方案是SpringBoot+M…

    Java 2023年5月31日
    00
  • 深入理解java long 存储时间戳

    深入理解Java long存储时间戳攻略 前言 在Java开发中,时间戳是一个很常见的概念,它可以表示一个时间点距离某个固定的参考时间点(称为基准时间)的时间差。时间戳通常用来表示事件发生的时间,或者是开发者自己记录的某个状态改变的时间,因为时间戳是一个标准的数字表示方式,因此使用广泛。 在Java中,通常使用long类型来存储时间戳。然而,Java lon…

    Java 2023年5月20日
    00
  • SpringMVC返回json数据的三种方式

    在 Spring MVC 中,我们可以使用三种方式来返回 JSON 数据。本文将详细讲解这三种方式,包括使用 @ResponseBody 注解、使用 ResponseEntity 类和使用 MappingJackson2JsonView 视图,并提供两个示例说明。 使用 @ResponseBody 注解 在 Spring MVC 中,我们可以使用 @Resp…

    Java 2023年5月18日
    00
  • JSP+ MySQL中文乱码问题post提交乱码解决方案

    JSP + MySQL 中文乱码问题主要发生在使用post方式提交数据时,提交的中文字符在数据库中查询后会变成乱码。下面我将详细讲解如何解决此问题。 问题分析 JSP中表单提交后,浏览器会自动将中文字符转码为UTF-8编码,而JDBC默认使用ISO8859_1编码与数据库进行交互,因此,需要将数据先从UTF-8编码转换为ISO8859_1编码,再进行插入,这…

    Java 2023年5月20日
    00
  • maven项目下solr和spring的整合配置详解

    下面是详细讲解“maven项目下solr和spring的整合配置详解”的完整攻略。 简介 在Maven项目中使用Solr的时候,我们经常会使用Spring框架进行整合。配置Spring和Solr的整合后,我们就可以使用Spring的依赖注入机制来使用Solr的API。 配置Solr 添加Solr依赖 在Maven项目的pom.xml文件中添加Solr的依赖。…

    Java 2023年5月19日
    00
  • java 数据库连接与增删改查操作实例详解

    Java 数据库连接与增删改查操作实例详解 数据库连接 在 Java 中,可以通过使用 JDBC 驱动程序来实现与数据库的连接。步骤如下:1. 加载驱动程序2. 建立数据库连接3. 关闭数据库连接 加载驱动程序 Java 中的 DriverManager 类提供了一个用于加载 JDBC 驱动程序的 registerDriver() 方法。驱动程序可以通过 C…

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