springboot 批量下载文件, zip压缩下载

news2024/11/15 12:39:44

一、使用hutool 工具类

效果:下载速度可以

1、依赖:hutool


<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.26</version>
</dependency>

2、调用方式

import cn.hutool.core.util.*;
HttpServletResponse response;


List<String> resourceList = StrUtil.split(fileUrls, ",");
        List<File> fileList = resourceList.stream()
                .map(x->new File("文件路径" + 根据预览路径获取对应文件路径(x)))
                .toList();

        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
        FileUtils.setAttachmentResponseHeader(response, zipName);

        ZipUtil.zip(response.getOutputStream(), Charset.defaultCharset(),true,null, ArrayUtil.toArray(fileList,File.class));

3、依赖工具类

import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;

import java.io.*;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;

public class FileUtils {

    /**
     * 百分号编码工具方法
     *
     * @param s 需要百分号编码的字符串
     * @return 百分号编码后的字符串
     */
    public static String percentEncode(String s) {
        return URLUtil.encode(s).replaceAll("\\+", "%20");
    }

    /**
     * 下载文件名重新编码
     *
     * @param response     响应对象
     * @param realFileName 真实文件名
     */
    public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) {
        String percentEncodedFileName = percentEncode(realFileName);

        StringBuilder contentDispositionValue = new StringBuilder();
        contentDispositionValue.append("attachment; filename=")
                .append(percentEncodedFileName)
                .append(";")
                .append("filename*=")
                .append("utf-8''")
                .append(percentEncodedFileName);

        response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename");
        response.setHeader("Content-disposition", contentDispositionValue.toString());
        response.setHeader("download-filename", percentEncodedFileName);
    }

}

二、原生java方式

参考

使用ZipEntry压缩与解压缩-CSDN博客文章浏览阅读1.8w次,点赞4次,收藏31次。import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io_zipentryhttps://blog.csdn.net/sinat_34620530/article/details/54093862

java下载zip附件_zipentry通过链接下载附件-CSDN博客文章浏览阅读1.1k次。1. 将文件下载到文件夹中,打包zip放入浏览器/* * Copyright 2019 yifen7.com All right reserved. This software is the * confidential and proprietary information of yifen7.com ("Confidential * Information"). ..._zipentry通过链接下载附件https://blog.csdn.net/weixin_41564440/article/details/102631447

 1、原生的下载

可以封装下载工具类,这里就没优雅实现(懒得改之前的代码)

import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

HttpServletResponse response = 前台获取;

 String fileName = "data_bk_" + getCurrentTimeStr();
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".zip");

        response.setContentType("application/octet-stream;charset=UTF-8");
OutputStream outputStream= null;
        ry {
            outputStream= response.getOutputStream();
            // 2 新建压缩包、文件扩展名根据驱动判断
        ZipOutputStream zos = new ZipOutputStream(outputStream);
String saveSqlName = "添加的文件名";

// 1.1 将备份的sql放入压缩包
        ZipEntry fileEntry = new ZipEntry(saveSqlName);
        zos.putNextEntry(fileEntry);

        // 1.2 通过文件流将该文件写入
String saveSqlFile = "d:\\xx.sql"
        FileInputStream fis = new FileInputStream(saveSqlFile);
        byte[] buffer = new byte[4096];
        int len;
        while ((len = fis.read(buffer)) != -1) {
            messageDigest.update(buffer, 0, len);
            zos.write(buffer, 0, len);
            zos.flush();
        }
        fis.close();
        zos.closeEntry();

//或者
/**
BufferedInputStream bis = new BufferedInputStream(
                    new FileInputStream(file));
            while ((count = bis.read(data, 0, bufferLen)) != -1) {
                zos.write(data, 0, count);
            }
bis.close();
zos.closeEntry();
**/
       

//2.1 多个文件重复操作...

        } catch (Exception e) {
            log.error("数据备份出错:{}", e);
        } finally {
            try {
                os.flush();
                os.close();
            } catch (IOException e) {
                log.error("数据备份出错:{}", e);
            }

        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1616698.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初识《list》及手搓模拟《list》

目录 前言&#xff1a; 1. list的介绍及使用 list的介绍&#xff1a; list的使用&#xff1a; 1、list的构造​编辑 2、list iterator的使用 3、list capacity 4、list element access 5、list modifiers 2.list的模拟实现 1、关于迭代器&#xff1a; 2、迭代器类的…

如何搭建一个vue2组件库(king-ui-pro)

文章引用图片无法查看&#xff0c;直接查看原文 感兴趣的可以关注或订阅下这个系列&#xff0c;后续会陆续将相关的组件与公共方法进行分享 目前已经完成了的组件有 多行省略pro版&#xff0c;不是简单的多行省略效果 公共方法&#xff1a; 1、图片预览&#xff0c;知乎的图…

MOS产品在电池化成分容设备上的应用与型号分析

据市场研究机构预测&#xff0c;全球电池化成分容产线市场规模在未来几年将继续保持增长态势。其中&#xff0c;亚洲市场增长速度最快&#xff0c;尤其是中国市场。中国政府对于新能源汽车和储能领域的支持力度不断加大&#xff0c;推动了电池化成分容产线的市场需求不断增长。…

ZISUOJ 高级语言程序设计实训-基础B(部分题)

说明&#xff1a; 有几个题是不会讲的&#xff0c;我只能保证大家拿保底分。 题目列表&#xff1a; 问题 A: 统计字母个数 思路&#xff1a; 把a到z放map里处理后输出即可。 参考题解&#xff1a; #include <iostream> #include <string> #include <map> …

台灯的功能作用有哪些?分享护眼灯排行榜前十名

说到台灯相信大家都不陌生&#xff0c;基本家家户户都会备上一台&#xff0c;不过也有家长存在疑惑&#xff0c;台灯的功能作用有哪些呢&#xff1f;其实台灯最主要的作用就是补充桌面不足的照明&#xff0c;一般单靠室内灯提供亮度是远远不够的&#xff0c;容易造成桌面亮度不…

“卫星-无人机-地面”遥感数据快速使用及地物含量计算的实现方法

原文链接&#xff1a;“卫星-无人机-地面”遥感数据快速使用及地物含量计算的实现方法https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601940&idx6&sn515e01666037570939aaf0eee56f46d1&chksmfa820ef3cdf587e5276eac181c890026b6ca4bc36ce0e4f80d89d…

Linux开机启动流程

Linux开机启动流程详细步骤如下图&#xff1a; 其中&#xff1a; POST:Power On Self Test --加电自检 BIOS: Basic Input Output System --基础输入输出系统 MBR: Master Boot Record --主引导记录 GRUB: GRand Uni…

【electron3】electron将数据写入本地数据库

安装 yarn add sqlite3 --save连接并调用数据库&#xff0c;创建表 createDB.ts文件内容 const sqlite3 require(sqlite3) const NODE_ENV process.env.NODE_ENV const path require(path) const { app } require(electron) let DB_PATH path.join(app.getAppPath(), /…

CUDA编程【2】-(51-78)

系列文章目录 文章目录 系列文章目录前言51、寄存器溢出51.1 溢出概念51.1 使用控制 52、本地内存和共享内存52.1 本地内存52.2. 共享内存 53. 常量内存53.1 概念53.2 初始化 54. 全局内存54.1 概念54.2 初始化 55. GPU缓存和变量作用域55.1 缓存类型55.2 变量作用域 56. 静态全…

vue基础语法学习

Object.defineProperty方法的使用 // 这是一个普通的对象 let phone {} // 给这个phone新增一个属性 三个参数&#xff1a;新增属性的对象&#xff0c;新增啥属性&#xff0c;属性值&#xff0c;key value对 Object.defineProperty(phone,color,{value:太空灰, //设置属性值wr…

互联网大厂ssp面经,数据结构part2

1. 什么是堆和优先队列&#xff1f;它们的特点和应用场景是什么&#xff1f; a. 堆是一种特殊的树形数据结构&#xff0c;具有以下特点&#xff1a;i. 堆是一个完全二叉树&#xff0c;即除了最后一层外&#xff0c;其他层都是满的&#xff0c;并且最后一层的节点都靠左对齐。i…

【css】select实现placeholder效果

场景&#xff1a;使用select下拉选择框的时候&#xff0c;需要像其他控件一样提示默认信息。 问题&#xff1a;表单控件select没有placeholder属性。 解决方案&#xff1a;通过css实现&#xff0c;不需要js <style>select > option[disabled]{ color:#999;cursor: n…

【数据结构(邓俊辉)学习笔记】向量01——接口与实现

文章目录 0.意图1、概述2 从数组到向量3 向量ADT接口4 Vector 模板类5 构造与析构5.1默认构造方法5.2基于复制的构造方法5.3 析构方法 0.意图 一方面是将工作学习中零星的知识点串起来&#xff0c;另一方面向量是其他数据类型的基础&#xff0c;比如栈队列等&#xff0c;所以基…

【C语言】每日一题,快速提升(10)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 题目&#xff1a;圣诞树 输入&#xff1a; 1输出&#xff1a; * * * * * **说明&#xff1a; 输入&#xff1a; 2输出&#xff1a; * * * * * * * …

近年数一,数二难度如何,听说24是像张宇那样的题?

直接上分数&#xff01; “估分一百零几&#xff0c;平时李林130-140&#xff0c;张八110-125的样子&#xff0c;超越做的分数也是100出头。” 24学长说&#xff1a; “远离李林张八&#xff01;张四没做不评价。” “李林张八暑假前做完当作打基础即可。超越才是真题难度”…

WordPress social-warfare插件XSS和RCE漏洞【CVE-2019-9978】

WordPress social-warfare插件XSS和RCE漏洞 ~~ 漏洞编号 : CVE-2019-9978 影响版本 : WordPress social-warfare < 3.5.3 漏洞描述 : WordPress是一套使用PHP语言开发的博客平台&#xff0c;该平台支持在PHP和MySQL的服务器上架设个人博客网站。social-warfare plugin是使用…

获取肖博数学全套视频+讲义

肖博数学是一个专业团队&#xff0c;教学方法非常颠覆&#xff0c;具有很多技巧&特殊的解题方法内容&#xff0c;能使得学生在高考时冲刺高分 hello&#xff0c;今天分享一下高中数学资料&#xff0c;肖博数学&#xff0c; 他们的教学方法与传统的教学方式有所不同&#…

使用HTML+css+js+jQuery完成,输入用户信息,转换为数据表格

案例图 案例源码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>User Information Form</ti…

基于vue+node+mysql的视频校对系统

一、登录注册&#xff1a;包括登录&#xff0c;注册&#xff0c;忘记密码&#xff0c;验证码等常用点。 二、用户管理&#xff1a;包括用户的增删改查 三、权限管理&#xff08;请增加这个权限&#xff1a;任务分配——只有管理者才能发布和删除任务&#xff1b;管理员设置。 四…

HTML中的文档声明

前言 什么是<!DOCTYPE>&#xff1f;是否需要在 HTML5 中使用&#xff1f;什么是严格模式与混杂模式&#xff1f; 文档声明概念 HTML 文档通常以文档声明开始&#xff0c;该声明的作用是帮助浏览器确定其尝试解析和显示的 HTML 文档类型。 <!DOCTYPE html>文档声…