文章目录

  • 前言 : 此 Demo 为 Windows 环境下演示,部署到服务器的话路径需改成服务器的路径。
  • 一、自定义工具类DownLoadZipUtil
  • 二、Dao层分析与sql
    • mapper层代码(DAO)
  • 三、Service层代码
  • 三、Controller层代码
    • 注意 : 文件的打包下载这里用到了临时路径,下面只需要关注方法ZipTempDownLoad即可,下面的代码实际需根据自己的逻辑需求去写。
  • 四、前端部分代码,此Demo前端用的vue,根据你自己使用的去写就可以了,此处仅供参考。
  • 五、效果展示

前言 : 此 Demo 为 Windows 环境下演示,部署到服务器的话路径需改成服务器的路径。

此文基于SpringBoot,实现多文件的打包下载,废话不多说直接上代码。

最近注意到这篇打包下载频繁的被大家访问,觉得大家应该做的项目大部分都有这个需求,今天把它完善一下更加通俗易懂,如果有用请点赞收藏!!


一、自定义工具类DownLoadZipUtil

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;/*** @author 码不多* @version 1.0* @description: 下载打包Zip工具类* @date 2021/8/20 13:47*/
public class DownLoadZipUtil {/*** 功能描述:  将文件打包的方法,需要传一个压缩路径,和一个文件,一次只将一个文件写入压缩包* @author 码不多* @date 2021/8/21* @param filePath 文件路径@param zipOut 压缩流@param realFileName 真实的文件名* @return void*/public static void fileToZip(String filePath,ZipOutputStream zipOut,String realFileName) throws IOException {// 需要压缩的文件File file = new File(filePath);//创建文件输入流FileInputStream fileInput = new FileInputStream(filePath);// 缓冲byte[] bufferArea = new byte[1024 * 10];BufferedInputStream bufferStream = new BufferedInputStream(fileInput, 1024 * 10);// 将当前文件作为一个zip实体写入压缩流,realFileName代表压缩文件中的文件名称zipOut.putNextEntry(new ZipEntry(realFileName));int length = 0;// 写操作while ((length = bufferStream.read(bufferArea, 0, 1024 * 10)) != -1) {zipOut.write(bufferArea, 0, length);}//关闭流fileInput.close();// 需要注意的是缓冲流必须要关闭流,否则输出无效bufferStream.close();// 压缩流不必关闭,使用完后再关}
}

二、Dao层分析与sql

注意 : 打包下载文件,一般都是下载多个文件,而这多个文件一定有一个唯一标识与之对应,我们在前端要拿到这个唯一标识传递到后端,如下面的公告名称或者id。


如图这是我存储公告的数据库表 id为主键列为一对多的一,也就是发布的公告 id 为 17

这张为存储上传文件路径的数据表这里为一对多的多,fid对应的是公告表的主键列id 17

了解了字段对应关系来看mapper.xml的映射sql,对应上面的例子就是查询出所有fid为17的附件,返回文件路径等信息。

    <!--模板批量下载根据id和外键id,查询路径--><select id="findFileTempById" parameterType="int" resultType="com.mabuduo.entity.FileTemp">SELECT xc_xc_filetemp.id,xc_xc_filetemp.dir_path,xc_xc_filetemp.file_newName,xc_xc_filetemp.file_name,xc_xc_message.aboutFROM xc_xc_filetemp,xc_xc_messageWHERE xc_xc_filetemp.fid = #{mid}AND xc_xc_filetemp.fid = xc_xc_message.id;</select>

这里是用的实体类来接收返回的列表数据

mapper层代码(DAO)

    /*** 功能描述: 批量下载模板接口,查询模板名称显示前端页面* @author 码不多* @date 2021/8/20* @param mid message的id值* @return java.util.List<com.mabuduo.entity.FileTemp>*/List<FileTemp>  findFileTempById(@Param("mid") int mid);

三、Service层代码

service

    /*** 功能描述: 批量下载模板接口,查询公告信息显示前端* @author 码不多* @date 2021/8/20* @param mid message的id值* @return java.util.List<com.mabuduo.entity.FileTemp>*/List<FileTemp> findFileTempById(int mid);

serviceimpl

    //DI注入mapper层@Autowiredprivate FileTempMapper fileTempMapper;/*** 功能描述: 批量下载模板接口,查询公告信息显示前端* @author 码不多* @date 2021/8/20* @param mid* @return java.util.List<com.mabuduo.entity.FileTemp>*/@Overridepublic List<FileTemp> findFileTempById(int mid) {return fileTempMapper.findFileTempById(mid);}

三、Controller层代码

注意 : 文件的打包下载这里用到了临时路径,下面只需要关注方法ZipTempDownLoad即可,下面的代码实际需根据自己的逻辑需求去写。

/*** @author 码不多* @version 1.0* @description: 打包下载模板控制器* @date 2021/8/19 13:53*/
@CrossOrigin
@RestController
@RequestMapping("/sys")
@Slf4j
@Transactional
public class FileTempDownLoadController {//定义存储压缩包的临时路径,这里我写在了配置文件中方便修改@Value("${zipFilePath.path}")private String zipFilePath;//DI@Autowiredprivate FileTempDownLoadServiceImpl fileTempDownLoadService;/*** 功能描述: 压缩包下载模板* @author 码不多* @date 2021/8/20* @param id 模板公告id * @param response 响应* @return void*/@Transactional//@LogAnnotationMethod(module = "下载模板",operator = "打压缩包下载模板")@RequestMapping(path = "/downloadTempZip",method={RequestMethod.POST,RequestMethod.GET})public void ZipTempDownLoad(@RequestParam("id") int id, HttpServletResponse response){//通过id获取路径List<FileTemp> fileTempById = fileTempDownLoadService.findFileTempById(id);//创建集合存储路径ArrayList<String> pathList = new ArrayList<String>();//遍历集合取出路径for (FileTemp fileTemp:fileTempById){//获取到真实的文件名String realFileName = fileTemp.getFile_name();//拿到文件目录路径String dir_path = fileTemp.getDir_path();//拿到文件名String file_newName = fileTemp.getFile_newName();//拼接成全路径| 将真实的文件名也拼接进去,通过/进行分割,下面进行拆分,否则文件的真实名称将获取不到String realPath = dir_path+file_newName+"/"+realFileName;//向集合中添加路径pathList.add(realPath);}//这里我是需要公告名称给压缩包命名的所以获取公告名称。   //获取公告名称,用于给压缩包命名,因为它们一个共用一个公告名所以随便取集合中的一个就可以String packageName = fileTempById.get(0).getAbout()+".zip";//判断集合是否有路径if (pathList.size() != 0) {// 压缩输出流,包装流,将临时文件输出流包装成压缩流,将所有文件输出到这里,打成zip包ZipOutputStream zipOut = null;try {zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath+packageName));} catch (FileNotFoundException e) {e.printStackTrace();}// 循环调用压缩文件方法,将一个一个需要下载的文件打入压缩文件包for (String path : pathList) {//将路径进行拆分,将上面拼接的真实文件名拆分出来作为参数传递进去int lastIndexOf = path.lastIndexOf("/")+1;String realFileName = path.substring(lastIndexOf, path.length());//将路径进行拆分,获取存储路径String realPath = path.substring(0, lastIndexOf - 1);try {//调用工具类方法,传递路径和压缩流,压缩包文件的名字DownLoadZipUtil.fileToZip(realPath,zipOut,realFileName);} catch (IOException e) {e.printStackTrace();}}try {// 压缩完成后,关闭压缩流zipOut.close();} catch (IOException e) {e.printStackTrace();}//提高作用域String fileName = null;try {//下载名称并转为ISO-8859-1格式,解决中文乱码fileName = new String(packageName.getBytes("UTF-8"), "ISO8859-1");//设置内容内容型应用下载,设置字符集response.setContentType("application/x-download;charset=utf-8");//告诉客户端该文件不是直接解析而是以附件的形式打开(下载)response.setHeader("Content-Disposition", "attachment;filename="+fileName);} catch (UnsupportedEncodingException e) {e.printStackTrace();}//提高作用域ServletOutputStream outputStream = null;FileInputStream inputStream = null;try {//该流不可以手动关闭,手动关闭下载会出问题,下载完成后会自动关闭outputStream = response.getOutputStream();inputStream = new FileInputStream(zipFilePath+packageName);} catch (IOException e) {e.printStackTrace();}try {//文件下载,复制IOUtils.copy(inputStream, outputStream);} catch (IOException e) {e.printStackTrace();}// 关闭输入流try {if (inputStream!=null){inputStream.close();}} catch (IOException e) {e.printStackTrace();}//下载完成,删掉zip包File fileTempZip = new File(zipFilePath+packageName);fileTempZip.delete();}}
}

四、前端部分代码,此Demo前端用的vue,根据你自己使用的去写就可以了,此处仅供参考。

<template slot-scope="scope">
<!--传递行信息--><el-button type="primary"  size="mini" @click="ZipDownLoad(scope.row)">打包下载</el-button></template>

js

       /*** 功能描述: 打包下载模板* @author 码不多* @return*/ZipDownLoad(row){axios({method: 'GET',url: 'http://localhost:8081/sys/downloadTempZip?',params: {id:row.id},responseType: 'blob'}).then(response => {//创建文件流对象let blob = new Blob([response.data], { type: 'application/zip' })//判断后端传递过来的流是否为不为空if (blob.size!==0){//获取heads中的filename文件名,这种方式在跨域的情况下获取不到默认响应头外的信息。/*let fileName = response.headers["Content-Disposition"].split(";")[1].split("filename=")[1];*/let url = window.URL.createObjectURL(blob) // 创建新的URL表示指定的blob对象//设置打包的名字let fileName = row.about//创建a标签元素节点let a = document.createElement('a')a.style.display = 'none'a.href = url // 指定下载链接a.download = fileName // 指定下载文件名a.click()URL.revokeObjectURL(a.href) // 释放URL对象/*这样下载文件名为乱码所以不再采用 window.location.href = url*/}else{this.$message.warning("当前公告下暂无上传的附件!")}}).catch(error => this.$message.error(error) )}

五、效果展示


# 总结 因为比较忙的关系,代码不再进行拆分讲解,不懂可以评论解答或者直接加微信 ldq122522一起交流技术分享资料。

SpringBoot多文件压缩包下载(多附件zip格式)相关推荐

  1. 多文件批量下载打包成.zip

    多文件批量下载打包成.zip //下载文件打包成zip压缩包@GetMapping("/zip/{id}")public void zip(@PathVariable(" ...

  2. java文件批量下载打包成zip

    1.首先html页面获取当前需要下载文件的id集合将转成字符串形式传递到后台. ................ 2 .下面就是获取字符串之后的批量下载/*** 多文件批量下载压缩成zip**root ...

  3. python 实现文件的批量压缩为.zip格式+.zip格式文件的解析

    python 实现文件的批量压缩为.zip格式+.zip格式文件的解析 python 实现文件的批量压缩为.zip格式 Python解析.zip文件的常见函数 python 实现文件的批量压缩为.zi ...

  4. java 把文件打包成zip文件_java将文件或是文件夹打包压缩成zip格式

    导读热词 下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. import java.io.BufferedInputStream; impo ...

  5. HDFS文件系统内的文件格式转换(zip格式转化成gzip格式)

    这篇主要介绍利用hdfs接口,使用java编程向hdfs写入数据. 一.模仿hadoop fs -put 和 -copyFromLoca命令,实现本地复制文件到hdfs: View Code 二.写一 ...

  6. Java实现文件压缩与解压[zip格式,gzip格式]

    原文:http://www.cnblogs.com/visec479/p/4112881.html#3069573 Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个 ...

  7. java gzip 解压文件_Java实现文件压缩与解压[zip格式,gzip格式]

    原文:http://www.cnblogs.com/visec479/p/4112881.html#3069573 Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个 ...

  8. php下载文件压缩包已经损坏或未知格式,这个压缩文件格式未知或者数据已经被损坏解决方法...

    "这个压缩文件格式未知或者数据已经被损坏"解决方法 1.如果是从网上下载的压缩文件,很有可能是网站提供的本身就是损坏的压缩文件.如果重新下载之后仍然是损坏的,可以从其他网站下载. ...

  9. springboot 多文件压缩下载(流)

    zip工具类: /*** 把文件打成压缩包并输出到客户端浏览器中*/public static void downloadZipFiles(HttpServletResponse response, ...

最新文章

  1. WAIC | 云天励飞副总裁肖嵘:创「芯」时代 打造自进化城市智能体
  2. 最锋利的Visual Studio Web开发工具扩展:Web Essentials详解
  3. delphi 折叠代码 快捷键_我收藏的几个更快搬砖的vscode快捷键
  4. Java 里的泛型简介.
  5. mongodb创建用户名和密码_Python中使用MongoDB详解
  6. Ellex激光器参数与激光消融手术风险的关系
  7. EF Core 实现读写分离的最佳方案
  8. CodeForces 841B (B) 博弈
  9. go语言快速刷《程序员面试金典》(2)
  10. iOS compare 字符串比较
  11. Spring Boot一个极简且完整的后台框架
  12. C#Panel 控件的使用
  13. 关于子网掩码的是是非非
  14. java怎么定义范围_java – Dagger自定义范围,怎么办?
  15. c语言switch结构计算利润,求助。。关于用switch编写简易计算器
  16. 一个简单计算器demo 拥有记忆和记忆清除功能
  17. 《大企业云桌面运维实战》v1.13
  18. python2和python3的编码区别
  19. 判断整数_2021暑期强化不定方程整数解问题
  20. 镜像miracast投屏软件_miracast投屏软件下载

热门文章

  1. 编程式跳转+传参并接收
  2. adobe air linux centos,Adobe AIR(跨平台应用)
  3. 计算机卡怎么解决,电脑卡怎么办,详细教您电脑卡怎么解决
  4. 【转】感觉像绕口令般的英语组句
  5. 移动光驱装服务器系统盘,光驱别扔,可以改装成移动光驱用
  6. matlab水下机器人,水下机器人路径控制与仿真
  7. win10+TeamVIew+花生壳 0元实现 远程开机教程附带截图超详细 已实践成功
  8. 在线加密解密网站大全2022(更新中ing)
  9. 鸿蒙宴中的人物故事,鸿门宴简介_鸿门宴的主要人物和背景_鸿门宴的目的和结局是什么? - 趣历史...
  10. Air101-LCD扩展板按键测试程序