1.1前端添加按钮

<a-button @click="downloadApplicationFile" type="primary">导出申请书zip</a-button>

1.2 downloadFileZip接口

/*** 下载文件 用zip压缩后导出* @param url* @param parameter* @returns {*}*/export function downloadFileZip(url,parameter){return axios({url: url,params: parameter,method:'get' ,
//注意要设置blob,否则下载出来的文件可能失效responseType: 'blob'})
}

1.3 downloadApplicationFile事件,VUE的AJAX下载方式,因为我请求头需要token,采用此种方式

//这里我传了一个参数,用来分辨自己要下载哪些文件
downloadZipUrl: '/proposal/projProposal/downloadZipUrl?period=' + this.$store.getters.period,//导出申请书pdf压缩文件
downloadApplicationFile(){downloadFileZip(this.url.downloadZipUrl, {}).then((res) => { //这个res为blob对象if(window.navigator.msSaveOrOpenBlob){//IEnavigator.msSaveBlob(res,'快速筛选申请书.zip')}else{//创建一个a标签const ele = document.createElement('a') //URL.createObjectURL(blob)返回URL对象,表示指定的File对象//设置下载文件的url地址,该地址指定File对象ele.setAttribute('href',URL.createObjectURL(res))
/*** download的属性是HTML5新增的属性* href属性的地址必须是非跨域的地址,如果引用的是第三方的网站或者说是前后端分离的项目(调用后台的接口),这时do    wnload就会不起作用。* 此时,如果是下载浏览器无法解析的文件,例如.exe,.xlsx..那么浏览器会自动下载,但是如果使用浏览器可以解析的文    件,比如.txt,.png,.pdf....浏览器就会采取预览模式* 所以,对于.txt,.png,.pdf等的预览功能我们就可以直接不设置download属性(前提是后端响应头的Content-Type:    application/octet-stream,如果为application/pdf浏览器则会判断文件为 pdf ,自动执行预览的策略)
*/ele.setAttribute('download','未知文件.zip') //设置downloadele.click()//删除之前创建的URL对象URL.revokeObjectURL(ele.href)//删除自己创建的组件,也就是最开始的a标签document.body.removeChild(ele)}})
},

2.1 后端接口

/**
* 导出pdf的zip文件
*/
@RestController
@RequestMapper("/proposal/projProposal")
public class ProposalController{@GetMapping("/downloadZipUrl")public Result<?> downloadZipUrl(){return Result.OK();}
}

思路:
查看要导出的文件是否存在,存在就copy一份作为临时文件,然后通过流下载,返回二进制流给前端处理,然后删除临时创建的文件

2.2 后端代码,这里就直接写在控制层了

@GetMapping("/downloadZipUrl")public Result<?> downloadZipUrl(Integer period,HttpServletResponse response){/*** 1.获取需要导出的项目信息* 2.创建新地址,获取申请书存放文件地址,然后copy文件,并放在新创建的地址下作为临时文件* 3.将获取到的文件进行压缩* 4.删除临时文件*/QueryWrapper<ProjProposal> queryWrapper = new QueryWrapper<>();//筛选需要的pdf文件queryWrapper.eq("period",period);List<ProjProposal> list = projProposalService.list(queryWrapper);//声明临时文件地址private String uploadpath = "E:\\zipText"; String newUploadPath = uploadpath + "\\downloadZip";try {//循环项目集合,确认每个项目的文件地址,并创建临时文件//ProjProposal为pojo对象,存有pdf文件地址proposal.getProposalFilePdf()for (ProjProposal proposal : list){//创建临时文件File newUploadFile = new File(newUploadPath);//临时文件,用完即删newUploadFile.mkdirs();//判断自己要压缩的pdf存不存在,不存在则捕获异常并返回if (FileUtil.exist(uploadpath + "\\" + proposal.getProposalFilePdf())) {//将需要的pdf文件,复制到临时文件中FileUtil.copy(uploadpath + "\\" + proposal.getProposalFilePdf(),newUploadPath + "\\" + proposal.getProposalFilePdf(),true);}}//ZipUtil  利用ZipUtil将存有需要的pdf临时文件变成zip文件File zipFile= ZipUtil.zip(newUploadPath);/*开始下载zip文件*///输出流,输出在客户端ServletOutputStream outputStream = null;//文件输入流FileInputStream inputStream = null;try {/*1. 获取zip文件输入流*/inputStream = new FileInputStream(zipFile);/*2.定义输出流*/outputStream = response.getOutputStream();/*3.定义客户端请求头*/response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("未知文件.zip", "utf-8"));/*4.定义文件格式*/response.setContentType("application/zip");/*5.定义文件缓冲区,大小1M*/byte[] buffer = new byte[1024];/*6.每次循环写入1M的大小,直到该文件输入流被读完*///接收缓冲区大小的整数值,也就是1024int len;//循环读1Mwhile ((len = inputStream.read(buffer)) != -1){  //inputStream.read(buffer)返回读入缓冲区的字节总数也就是1024,到末尾返回-1outputStream.write(buffer,0,len); //void write(byte b[],int off,int len)把字节数组b中从下标off开始,长度为len的字节写入流中}}catch (Exception e){e.printStackTrace();}finally {try {inputStream.close();outputStream.close();} catch (IOException e) {e.printStackTrace();}}//删除临时文件FileUtil.del(newUploadPath);//删除临时zip文件FileUtil.del(newUploadPath + ".zip");}catch (Exception e){e.printStackTrace();return Result.error("没有这个文件夹,报了一个文件异常");}return null;}

下载本地pdf并压缩为zip文件相关推荐

  1. Vue下载本地pdf、word、excel文件

    Vue下载本地pdf.word.excel文件 项目需求 具体实现 注意 项目需求 在项目中需要对pdf.word.excel等文档的下载 也就是获取文件的静态路径,下载到本地. 方案 :利用 axi ...

  2. 4.Vue项目中下载本地pd、word、excel文件

    记录:Vue项目中下载本地pdf.word.excel文件 今日的一个需求是下载导入模板文件,该模板文件不是接口请求获取,而是本地的文件 该文章属转载:Vue下载本地pdf.word.excel文件 ...

  3. java zip压缩 加密码_java 压缩成zip文件、解压zip文件(可设置密码)

    1.情景展示 java实现将文件夹进行压缩打包的功能及在线解压功能 2.解决方案 方式一:压缩.解压zip 准备工作:slf4j-api.jar org.slf4j slf4j-api 1.7.25 ...

  4. Java 批量压缩图片zip文件

    使用Java自带的ZipOutputStream将指定的目录和文件压缩成ZIP文件,支持多级目录和空目录的压缩,下面代码示例: import java.io.*; import java.util.z ...

  5. 定期备份web工程,压缩为.zip文件

    前些天写了个小练习,定期备份web工程,感觉有点意思,也有点小用处.由于最近封闭开发,下班比较晚,所以电脑一般不关机,省得麻烦,这样就可以一直开着我本机的web服务器,每天备份我的web工程了.备份可 ...

  6. python压缩教程_如何使用Python压缩/解压缩zip文件?(代码示例)

    在批量交换大文件和多个文件时,使用zip文件是非常方便的.下面本篇文章就来带大家认识解一下zip文件,介绍使用Python压缩或解压缩zip文件的方法,希望对大家有所帮助.[视频教程推荐:Python ...

  7. 将文件夹压缩成zip文件

    一 代码 package ZipFile;import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUt ...

  8. Java导出多个excel并打包压缩成.zip文件

    1.先获取到数据,并将数据导出excel到指定位置 public void downPoliceZip(WorksitePoliceApiInfo worksitePoliceApiInfo) thr ...

  9. Qt压缩解压缩zip文件,解压缩加密zip文件

    本文是windows系统,MinGW64位环境,MSVC编译环境下在quazipd和libz库的编译过程有所不同. 本文用的下载文件和工程文件做了个压缩包: https://download.csdn ...

最新文章

  1. 深度学习损失函数大全
  2. 一个完整的DS1302时钟在STM32上的应用实例
  3. 基于CentOS 搭建 FTP 文件服务
  4. 你方唱罢我登场,“全宇宙仅此一回”的小米手机青春版竞争策略分析
  5. 管理集群中的 crs 管理员
  6. ubuntu18.10安装octave
  7. Python四大金刚之一:列表
  8. GDI+ 使用指南(basic guiding of GDI plus )
  9. 比_thread高级的threading模块,对比释放锁例子
  10. idea + debug
  11. 深入研究:HTTP2的真正性能到底如何
  12. [藏]常用的匹配正则表达式和实例
  13. 人民银行计算机机房,中国人民银行行计算机中心机房管理详细规定.doc
  14. 数据库、数据湖、数据仓库、湖仓一体、智能湖仓,分别都是什么鬼
  15. 微软在上海有哪些办公地点?上下班来回三小时?不止闵大荒!
  16. 计算机组成原理中阶符是什么,计算机组成原理习手册.doc
  17. 如何在Adobe Reader中存储阅读的Session
  18. 服务网格——服务网格架构(概念原理2)
  19. 【SQL】MySQL的查询语句
  20. 吗西香豆素,CAS号:17692-56-7

热门文章

  1. 前端:简述表单提交前如何进行数据验证
  2. 设计师一定要知道这5个免费样机素材网
  3. 腾讯第一批开发工程师徐钢武回忆道【曾几何时我真的认为代码是这样的】
  4. ubuntu和windows复制粘贴
  5. 关于MySQL的二次安装问题
  6. C语言计算正方体表面积
  7. 重磅!实在智能首创“智能融合拾取”技术!
  8. Win10系统中MySQL5.7的安装
  9. 北欧蓝rgb_2015年北欧游戏果酱
  10. Java 复制PPT幻灯片