注只适配utf-8的场景,待完善!
压缩为zip文件

  1. 通过java程序输出文件
/*** 功能:压缩多个文件成一个zip文件* @param srcfile:源文件列表* @param zipfile:压缩后的文件*/
public static void zipFiles(File[] srcfile, File zipfile) {byte[] buf = new byte[1024];try {//ZipOutputStream类:完成文件或文件夹的压缩ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipfile));for (int i = 0; i < srcfile.length; i++) {FileInputStream in = new FileInputStream(srcfile[i]);// 给列表中的文件单独命名out.putNextEntry(new ZipEntry(srcfile[i].getName()));int len;while ((len = in.read(buf)) > 0) {out.write(buf, 0, len);}out.closeEntry();in.close();}out.close();System.out.println("压缩完成.");} catch (Exception e) {e.printStackTrace();}
}

2.1 通过浏览器下载文件(返回文件流) - 方式一

/*** 功能:压缩多个文件,输出压缩后的zip文件流* @param srcfile:源文件列表* @param zipFileName:压缩后的文件名* @return*/
@GetMapping(value = "/downzip")
public ResponseEntity<byte[]> zipFiles(File[] srcfile, String zipFileName) {byte[] buf = new byte[1024];// 获取输出流ByteArrayOutputStream bos = new ByteArrayOutputStream();try {// ZipOutputStream类:完成文件或文件夹的压缩ZipOutputStream out = new ZipOutputStream(bos);for (int i = 0; i < srcfile.length; i++) {// 此处可用任意其他输入流将FileInputStream取代,outputStream为其他步骤的输出流// ByteArrayInputStream in = new ByteArrayInputStream(outputStream.toByteArray());FileInputStream in = new FileInputStream(srcfile[i]);// 给列表中的文件单独命名out.putNextEntry(new ZipEntry(srcfile[i].getName()));int len;while ((len = in.read(buf)) > 0) {out.write(buf, 0, len);}out.closeEntry();in.close();}out.close();bos.close();System.out.println("压缩完成.");} catch (Exception e) {e.printStackTrace();}// 设置http响应头HttpHeaders header = new HttpHeaders();header.add("Content-Disposition", "attachment;filename=" + zipFileName + ".zip");return new ResponseEntity<byte[]>(bos.toByteArray(), header, HttpStatus.CREATED);
}

2.2 通过浏览器下载文件(返回文件流) - 方式二

/*** 功能:压缩多个文件,输出压缩后的zip文件流* @param srcfile:源文件列表* @param zipFileName:压缩后的文件名* @param response: Http响应*/
@GetMapping(value = "/downzip")
public void zipFiles(File[] srcfile, String zipFileName, HttpServletResponse response) {byte[] buf = new byte[1024];// 获取输出流BufferedOutputStream bos = null;try {bos = new BufferedOutputStream(response.getOutputStream());} catch (IOException e) {e.printStackTrace();}try {response.reset(); // 重点突出// 不同类型的文件对应不同的MIME类型response.setContentType("application/x-msdownload");response.setCharacterEncoding("utf-8");response.setHeader("Content-disposition", "attachment;filename=" + zipFileName + ".zip");// ZipOutputStream类:完成文件或文件夹的压缩ZipOutputStream out = new ZipOutputStream(bos);for (int i = 0; i < srcfile.length; i++) {FileInputStream in = new FileInputStream(srcfile[i]);// 给列表中的文件单独命名out.putNextEntry(new ZipEntry(srcfile[i].getName()));int len;while ((len = in.read(buf)) > 0) {out.write(buf, 0, len);}out.closeEntry();in.close();}out.close();bos.close();System.out.println("压缩完成.");} catch (Exception e) {e.printStackTrace();}
}

以上两种方式,都是以输出文件流的形式,通过浏览器端进行下载,不同的是,第一种将流直接通过接口返回,第二种也是比较常见的一种,将文件流通过response进行输出,两种方式均可,这里留存记录下。
解压缩zip文件

/*** 功能:解压缩* @param zipfile:需要解压缩的文件* @param descDir:解压后的目标目录*/
public static void unZipFiles(File zipfile, String descDir) {try {ZipFile zf = new ZipFile(zipfile);for (Enumeration entries = zf.entries(); entries.hasMoreElements();) {ZipEntry entry = (ZipEntry) entries.nextElement();String zipEntryName = entry.getName();InputStream in = zf.getInputStream(entry);OutputStream out = new FileOutputStream(descDir + zipEntryName);byte[] buf1 = new byte[1024];int len;while ((len = in.read(buf1)) > 0) {out.write(buf1, 0, len);}in.close();out.close();System.out.println("解压缩完成.");}} catch (Exception e) {e.printStackTrace();}
}

springboot Java实现多文件的zip压缩操作 + 通过浏览器下载文件的两种方式相关推荐

  1. java applet怎么运行_Java如何运行Applet?运行Applet的两种方式

    详细内容 applet是一个小型的动态Java程序,那么如何运行Applet?本篇文章就给大家介绍Applet,让大家了解Applet是什么,运行Applet的方法,希望对你们有所帮助. Java a ...

  2. java匿名启动线程_使用匿名内部类:来创建线程的两种方式

    [Java]基础31:创建线程的两种方式 谢谢你的观看. 今天是我自学Java的第31天. 你的观看便是对我最大的鼓励. 话不多说,开始今天的学习: 线程的创建有两种方式,昨天学习过其中的一种: 创建 ...

  3. java 像素矩阵_Java图片读取之BufferedImage得到像素矩阵的两种方式

    最近在尝试着采用Java在图像处理领域实践一下常用的机器学习算法.首先涉及到的是如何将一副图片读取到一个像素矩阵中(Java中就是一维或二维数组中).在实践过程中,通过测试代码,我发现基于Buffer ...

  4. java reds 集群_java项目中配置redis-cluster集群的两种方式

    本文分两部分: (1)jedisCluster (2)Spring-Data-Redis集群配置和RedisTemplate用法 我这里是在本机上搭建的3主3从6个redis实例. 一,jedisCl ...

  5. Springboot实现浏览器下载文件

    public void getUnbondFile(HttpServletResponse response) throws FileNotFoundException, UnsupportedEnc ...

  6. 创建和应用Java包文件的两种方式

    <Java编程艺术>章节选登.作者:高永强 清华大学出版社 (即将出版) 12.1  包--package       包是Java提供的文件管理机制.包把功能相似的类,按照Java的名字 ...

  7. java文件读写的两种方式

    今天搞了下java文件的读写,自己也总结了一下,但是不全,只有两种方式,先直接看代码: public static void main(String[] args) throws IOExceptio ...

  8. java 读取css文件_java文件读取的两种方式

    JAVA中读取文件(二进制,字符)内容的几种方 JAVA中读取文件内容的方法有很多,比如按字节读取文件内容,按字符读取文件内容,按行读取文件内容,随机读取文件内容等方法,本文就以上方法的具体实现给出代 ...

  9. 创建和应用Java包文件的两种方式(转)

    创建和应用Java包文件的两种方式(转) <Java编程艺术>章节选登.作者:高永强 清华大学出版社 (即将出版) 12.1  包--package    ... 12.1.1  包命名规 ...

最新文章

  1. Openlayers中使用Cluster+Overlay实现点击单个要素和聚合要素时显示不同弹窗
  2. windows linux 融合,Windows和Linux的设备驱动框架的对比融合研究
  3. 201571030128/201571030118《小学四则运算练习软件软件需求说明》结对项目报告
  4. cm0中断优先级_转:第13章 FreeRTOS任务优先级修改及其分配方案
  5. redis和memcached相比的独特之处
  6. 传统存储做到极致也惊人!看宏杉科技发布的CloudSAN
  7. 布隆过滤器及其数学推导
  8. c语言中sizeof是一个标准库函数,对C语言中的sizeof的介绍分析
  9. Flink 的应用场景和架构模型
  10. Openresty 与 Tengine
  11. 【PATL2-002】链表去重(链表模拟)---水题
  12. 闻之色变-翻译公司用翻译工具翻译?!
  13. 10 系统建模语言SysML——参数图
  14. C51单片机的电子时钟(数码管显示)
  15. 立交匝道中边桩坐标放样正反算程序RAMP
  16. xmind可以画流程图吗_怎样用XMind方便地制作流程图
  17. esxi能直通的显卡型号_七彩虹RTX SUPER祝融(火神)版显卡上手体验
  18. Java入门篇(一)——如何编写一个简单的Java程序
  19. 原来linux自带编译器啊!!!
  20. 浅谈垃圾渗滤液处理设计要点

热门文章

  1. 如何摇晃一瓶水使其核聚变?
  2. 教育部公开曝光南大梁莹学术不端等4起典型案例
  3. 十大建筑中的数学之美
  4. 数学不好,如何转行人工智能?
  5. 1682亿背后丨一分钟看懂天猫双11
  6. java listview颜色_[摘]android listview选中某一行,成选中状态颜色高亮显示
  7. lex和yacc环境配置
  8. 拓扑排序 详解 + 并查集 详解 + 最小生成树详解
  9. OpenTSDB 开发指南之 查询数据
  10. 数字化让618有了洞悉消费者内心的“大脑”