最近遇到需求要下载材料清单的附件,一个清单下面可能存在多个文件,只存在一个附件直接下载该附件,如果存在多个附件将所有附件打包压缩之后下载压缩包,记录下文件下载以及文件压缩的处理

public void downLoadMaterialFile(HttpServletResponse response) throws Exception {//获取附件路径(数据库获取)ArrayList<String> filePathList = new ArrayList<>();if(filePathList.size() == 1){//只存在一个附件时直接下载对应附件File file = new File(filePathList.get(0));if(!file.exists()){throw new Exception("文件不存在");}//输出文件流writeFileToRes(response, file.getName(), file);}else if(filePathList.size() > 1){//压缩包名称(会拼上当前时间)String datumName = "压缩包名称";//压缩文件File file = compressedFileToZip(datumName, filePathList);//输出文件流writeFileToRes(response, file.getName(), file);//删除压缩包if(file.exists()){file.delete();}}
}/**
* 压缩文件
* @param datumName 压缩包名称
* @param filePathList 附件路径
* @return File
* @throws Exception Exception
*/
private File compressedFileToZip(String datumName, List<String> filePathList) throws Exception {//压缩包具体名称(拼接时间戳防止重名)String zipFileName = datumName + "-" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".zip";//生成压缩包存储地址(最后会删掉)String fileZip = "D:/" + zipFileName;OutputStream os=null;ZipOutputStream zos = null ;File file = new File(fileZip);try {if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}os=new FileOutputStream(file);//压缩文件zos = new ZipOutputStream(os);byte[] buf = new byte[1024];for (String filePath : filePathList) {File tempFile = new File(filePath);//在压缩包中添加文件夹//zos.putNextEntry(new ZipEntry("测试/"+tempFile.getName()));//直接在压缩包中添加文件zos.putNextEntry(new ZipEntry(tempFile.getName()));int len;FileInputStream in = new FileInputStream(tempFile);while ((len = in.read(buf)) != -1){zos.write(buf, 0, len);}zos.closeEntry();in.close();}} catch (Exception e) {e.printStackTrace();logger.info(e.toString());throw new Exception("文件打包:"+e.getMessage());}finally {//关闭流if(zos != null){try {zos.close();} catch (IOException e) {e.printStackTrace();}}//关闭流if(os!= null){try {os.close();} catch (IOException e) {e.printStackTrace();}}}return file;
}/*** 输出文件流到response* @param response response* @param fileName fileName* @param file file* @throws IOException IOException*/
private void writeFileToRes(HttpServletResponse response, String fileName, File file) throws IOException {FileInputStream inputStream = new FileInputStream(file);//1.设置文件ContentType类型,这样设置,会自动判断下载文件类型response.setContentType("application/octet-stream");//2.设置文件头:最后一个参数是设置下载文件名response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));response.addHeader("Content-Length", "" + file.length());//3.通过response获取ServletOutputStream对象(out)ServletOutputStream out = response.getOutputStream();int b = 0;byte[] buffer = new byte[1024];while (b != -1) {b = inputStream.read(buffer);//4.写到输出流(out)中out.write(buffer, 0, b);}out.flush();out.close();inputStream.close();}

转载于:https://www.ycblog.top/article?articleId=138&commentPageNum=1

java下载文件(多个文件进行打包下载)相关推荐

  1. java基础入门txt下载地址_java基础入门-ZipOutputStream打包下载

    今天跟大家聊聊使用ZipOutputStream打包下载,我下面是使用ant的jar打包的,因为他对应中文的支持比较好 大家也可以使用java.util.zip包里面的工具类打包,但是他对于中文不友好 ...

  2. php 打包下载网络图片,PHP实现图片批量打包下载功能

    上次遇到一个需要打包下载批量图片的问题,找了一下发现这个好方法,记录一下. 首先新建一个zipfile打包类: class zipfile { var $datasec = array (); var ...

  3. vue实现前台生成word并下载,并且可实现批量打包下载

    一.引用场景: 前面的一个项目里面有一个申报表,后台收集的申报表需要批量导出,一开始我是用到的C#的WordOpApControlle,但是这种方法存在一个难以解决的问题.就是当你导出的这个word模 ...

  4. 【jQuery】jQuery与vue实现点击下载图片 以及js实现批量打包下载图片

    原理:用canvas的toDataUrl() API获取到图片的base64编码,再利用触发a标签事件进行下载.(单张图片下载) 多张图片批量下载导出压缩包需要引入jsZip jQuery实现点击下载 ...

  5. java动态生成excel_java动态生成excel打包下载

    @SuppressWarnings("unchecked")public String batchExport() throwsDBException{ @SuppressWarn ...

  6. java文件下载功能代码(单文件下载、多文件批量打包下载)——普遍适用

    一.前言   程序员在做web等项目的时候,往往都需要添加文件上传.下载.删除的功能,有时是单文件,有时多文件批量 操作,而这些功能的代码程序员可以自己收藏起来当成工具使用,这样,程序员在进行程序设计 ...

  7. Springboot 从华为云OBS中打包下载文件到本地

    文章目录 前言 一.OBS是什么? 二.使用步骤 1.引入依赖 2.获取obs中的一些参数:endPoint,ak,sk还有桶名(重要,必须要有). 3.开始下载 4.设置out流的打包下载 总结 前 ...

  8. 浏览器中利用js打包下载所有类型文件

    浏览器中利用js打包下载所有类型文件 概述 ajax请求方式打包下载所有类型文件 canvas渲染方式打包下载所有图片 相关知识 作者 概述 需求:1.项目中在浏览器中点击按钮后根据多个url地址下载 ...

  9. JavaScript实战篇 -ajax方式实现js打包下载文件

    一.问题描述 在我们日常开发中,会遇到批量下载方面的问题;如上图所示,我们要批量下载图片,接下来我们就模拟实现这个功能,并将下载文件打包下载; 二.准备工作 2.1 JSZip JSZip 是一个 j ...

  10. java生成图片url_Java Springboot如何基于图片生成下载链接

    现有一些图片在服务器上的链接,在浏览器中打开这些链接是直接显示在浏览器页面的形式. 现在需要生成这些图片的单独下载以及打包下载链接,即在浏览器中打开下载链接后弹出下载框提示下载.由于前端存在跨域问题, ...

最新文章

  1. Nature:如何做一篇肠道菌群免疫的顶级文章
  2. R语言ggplot2可视化分面图使用facet_wrap函数和facet_grid函数实战
  3. R语言可视化韦恩图实战:VENN DIAGRAM
  4. .svn文件夹_新建SVN仓库并上传项目
  5. AD9910高速集成DDS芯片(verilog篇-串行模式篇-22个寄存器SPI通信周期控制)
  6. poj3061尺取法/前缀和 二分(java)
  7. HTML5 Web Worker
  8. Hibernate type 与java 和 数据库类型对应
  9. mysql 整数_MySQL 整数(int)数据类型
  10. 动态改变ListView布局
  11. Visual Studio 2005 移植 (札记之一)
  12. Excel文件处理实战-Python编程进阶
  13. 再次理解HTTP请求过程[概念原理篇]
  14. python颜色识别_OpenCV(Python)学习之识别图片特定颜色
  15. 泵引理 Pumping Lemma
  16. Swarm管理分布式docker
  17. 央企建筑施工企业职工教育培训数字化解决方案
  18. android 8.1 蓝牙打不开之CLOCK_BOOTTIME_ALARM问题
  19. vc++拾遗(7)-框架、视图、文档
  20. 进入紧急救援模式下更改管理员密码

热门文章

  1. Zernik矩亚像素边缘检测
  2. Zigbee定位技术下的隧道人员定位--隧道定位--新导智能
  3. poi 实现excel小例子
  4. Codeforces Round #826 (Div. 3)(A~D)
  5. 计算机算法项目经验例子,算法工程师岗位项目经验范文
  6. 如何判断一个数是否为素数
  7. 在vim中使用查找命令查找指定字符串
  8. mysql可以做决策树吗_决策树 - stream886 - 博客园
  9. 【CICC原创】面向全域作战态势感知的战场全息地图
  10. Stewart平台运动学