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日

相关文章

  • JDBC核心技术详解

    JDBC核心技术详解 JDBC(Java Database Connectivity)是Java语言访问关系型数据库的标准规范,其提供了一组API,以便于Java程序员在应用层面上来操作数据库。 JDBC驱动类型 JDBC驱动是连接Java应用程序和数据库的桥梁,根据其实现方式的不同,可以分为以下四种类型: JDBC-ODBC桥接式驱动 这种驱动实现的原理是…

    Java 2023年5月20日
    00
  • Java反射机制介绍

    Java反射机制介绍 什么是反射机制 Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;并能够调用任意一个方法和访问任意一个属性,这种动态获取信息以及动态调用对象的方法的功能称为Java反射机制。 反射机制的优缺点 反射机制非常强大且灵活,但也有一些缺点: 性能问题:反射调用方法的效率要比直接调用方法的效率低很多,所以在需要…

    Java 2023年5月26日
    00
  • Spring MVC 拦截器 interceptor 用法详解

    Spring MVC 拦截器(Interceptor)用法详解 什么是拦截器 拦截器是Spring MVC框架中的一种增强处理器,拦截器也可以称为过滤器(Filter)或者AOP实现,它可以在请求处理的过程中预处理请求、处理请求和处理完请求后进行后续处理。拦截器可以将特定的处理逻辑应用到整个应用程序或者某个特定的Controller中。 和Servlet的过…

    Java 2023年5月20日
    00
  • kaptcha验证码组件使用简介解析

    首先给出一份包含标题、正文内容和示例代码的markdown文本: Kaptcha验证码组件使用简介解析 Kaptcha是一款Java语言编写的验证码组件,可以非常方便地为Web应用添加验证码保护。它支持自定义验证码样式,包括验证码字符、字体、大小、颜色、背景等,同时还具备多语言支持、音频验证码功能以及代码简单等优点。 在下面的示例中,我们将详细讲解如何使用K…

    Java 2023年6月15日
    00
  • SpringBoot实现接口幂等性的4种方案

    下面是“SpringBoot实现接口幂等性的4种方案”的完整攻略: 什么是接口幂等性? 接口幂等性指的是对于同一请求,多次调用接口所产生的结果是一致的。常见的应用场景包括支付、订单创建等需要保证数据一致性的场景。 在实际开发中,由于应用的多实例部署,以及网络延迟等原因,可能会导致接口被重复调用,进而产生数据不一致的问题。因此,保证接口幂等性非常重要。 Spr…

    Java 2023年5月19日
    00
  • Mysql数据库编码问题 (修改数据库,表,字段编码为utf8)

    当我们在使用MySQL数据库时,可能会遇到中文乱码的问题。这个问题的根源就是MySQL数据库本身的编码问题。如果我们想要避免这种问题的出现,我们需要将数据库、表和字段的编码都设置为utf8编码。 以下是MySQL数据库编码问题的完整攻略: 1. 确定数据库、表和字段的当前编码 使用以下命令查看当前数据库的编码: SHOW CREATE DATABASE da…

    Java 2023年6月16日
    00
  • java使用多线程找出最大随机数

    找出最大随机数这一问题可以使用多线程来优化程序的效率和性能。Java提供了多种实现多线程的方法,本文将介绍如何使用Java多线程来寻找最大随机数。 1.使用Runnable接口 使用Runnable接口是实现多线程的最简单方法之一。Java中的Runnable接口定义了一个run()方法,当线程启动时该方法会被执行。我们可以通过实现Runnable接口并实现…

    Java 2023年5月19日
    00
  • java读取resource目录下文件的方法示例

    针对“java读取resource目录下文件的方法示例”,我将为你提供完整的攻略。请仔细阅读以下内容。 方法一:使用ClassLoader.getResource() ClassLoader.getResource() 方法可以帮助我们加载 classpath 中的资源,包括在 resource 目录下的文件。下面是一个简单的示例代码: public cla…

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