import lombok.extern.slf4j.Slf4j;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; @Slf4j
public class FileZipUtil { private static final String utf8 = "UTF-8"; /**
* 下载zip文件
* @param srcfile
* @param zipFileName
* @param response
*/
public static void createZipByBytes(List<Map<String, Object>> srcfile, String zipFileName, HttpServletResponse response) {
byte[] buf = new byte[1024];
BufferedOutputStream bos;
InputStream in = null;
ZipOutputStream out = null;
try {
bos = new BufferedOutputStream(response.getOutputStream());
response.reset();
response.setCharacterEncoding("utf-8");
response.addHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Expose-Headers", "*");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(zipFileName, utf8));
response.setContentType("application/octet-stream;charset=UTF-8");
out = new ZipOutputStream(bos);
for (int i = 0; i < srcfile.size(); i++) {
byte[] bytes = (byte[]) srcfile.get(i).get("content");
in = new ByteArrayInputStream(bytes);
out.putNextEntry(new ZipEntry(srcfile.get(i).get("fileName").toString()));
int len;
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
}
out.close();
bos.close();
log.info("压缩完成");
} catch (Exception e) {
log.error("zip文件打包异常{}",e.getMessage());
throw new BusinessException("zip文件打包异常");
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} /**
* 下载zip文件
* @param srcfile
* @param zipFileName
* @param response
*/
public static void createZipByFiles(List<File> srcfile,String zipFileName,HttpServletResponse response) {
byte[] buf = new byte[1024];
// 获取输出流
BufferedOutputStream bos;
FileInputStream in = null;
ZipOutputStream out = null;
try {
bos = new BufferedOutputStream(response.getOutputStream());
response.reset();
response.setCharacterEncoding("utf-8");
response.addHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Expose-Headers", "*");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(zipFileName, utf8));
response.setContentType("application/octet-stream;charset=UTF-8");
out = new ZipOutputStream(bos);
for (int i = 0; i < srcfile.size(); i++) {
in = new FileInputStream(srcfile.get(i));
out.putNextEntry(new ZipEntry(srcfile.get(i).getName()));
int len;
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
}
out.close();
bos.close();
log.info("压缩完成");
} catch (Exception e) {
log.error("zip文件打包异常{}",e.getMessage());
throw new BusinessException("zip文件打包异常");
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

多文件下载并打成zip文件传输到浏览器响应流的更多相关文章

  1. 文件传输基础——Java IO流

    一.文件的编码 package com.study.io; /** * 测试文件编码 */ public class EncodeDemo { /** * @param args * @throws ...

  2. 慕课网_文件传输基础——Java IO流

    第1章 文件的编码 1-1 文件的编码 (15:07) 第2章 File 类的使用 2-1 File 类常用 API 介绍 (10:50) import java.io.File; import ja ...

  3. 文件传输基础----Java IO流

    编码问题 一个很著名的奇怪现象:当你在 windows 的记事本里新建一个文件,输入"联通"两个字之后,保存,关闭,然后再次打开,你会发现这两个字已经消失了,代之的是几个乱码!呵呵 ...

  4. JAVA 实现将多目录多层级文件打成ZIP包后保留层级目录下载 ZIP压缩 下载

    将文件夹保留目录打包为 ZIP 压缩包并下载 上周做了一个需求,要求将数据库保存的 html 界面取出后将服务器下的css和js文件一起打包压缩为ZIP文件,返回给前台:在数据库中保存的是html标签 ...

  5. ASP.NET五步打包下载Zip文件

    本文版权归博客园和作者吴双共同所有,转载和爬虫请注明原文地址:www.cnblogs.com/tdws 首先分享几个振奋人心的新闻: 1.谷歌已经宣布加入.NET基金会 2.微软加入Linux基金会, ...

  6. Android中用Java代码实现zip文件解压缩

    如果需要下载的文件有很多是中文名的,解压时有中文名的文件出现乱码,试了很多方法不能解决问题.据说有一个Java插件包,用这个插件包可以解决中文名乱码的问题,但不知解压的文件是否要用它提供的类压缩后的文 ...

  7. 【.NET深呼吸】Zip文件操作(1):创建和读取zip文档

    .net的IO操作支持对zip文件的创建.读写和更新.使用起来也比较简单,.net的一向作风,东西都准备好了,至于如何使用,请看着办. 要对zip文件进行操作,主要用到以下三个类: 1.ZipFile ...

  8. Linux主机上实现树莓派的交叉编译及文件传输,远程登陆

    0.环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS:官网下的的raspb ...

  9. 使用 zssh 进行 Zmodem 文件传输

    Zmodem 最早是设计用来在串行连接(uart.rs232.rs485)上进行数据传输的,比如,在 minicom 下,我们就可以方便的用 Zmodem (说 sz .rz 可能大家更熟悉)传输文件 ...

  10. 艺萌TCP文件传输及自动更新系统介绍(TCP文件传输)(四)

    艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开源,作者是英国的,开发时间5年多,框架很稳定. 项 ...

随机推荐

  1. Virtualbox EFI 写入startup.nsh

    安装好的Debian系统,重启后会因为找不到入口而无法启动.定位grubx64.efi文件,可用ls直接查找或一步一步查找ls fs0:\EFI\debian\grubx64.efi edit fs0 ...

  2. Win10下VM虚拟机桥接模式无法上网的相关问题?

    首先:在LR中点击虚拟机->设置,勾选桥接模式,勾选之后无法上网 1.    选中虚拟网卡VMnet8(NAT模式)和WLAN(本机)网卡,右键选择"桥接",然后系统创建一个 ...

  3. VS编译运行报错:找不到ucrtbased.dll文件

    VS编译运行报错:找不到ucrtbased.dll文件 在VS2019中配置OpenCV编译,报如下错误: 解决方法:下载缺少的ucrtbased.dll文件,在免费的dll下载网站搜索下载,对应的有 ...

  4. elasticSearch(四)--结构化查询

    结构化查询 1.请求体查询 GET(POST) /_search POST /_search { "from": 30, "size": 10 } 2.DSL ...

  5. Flutter 中的普通路由、普通路由传值、 命名路由、命名路由传值

    一.Flutter 中的路由 Flutter 中的路由通俗的讲就是页面跳转.在 Flutter 中通过 Navigator 组件管理路由导航.并提供了管理堆栈的方法.如:Navigator.push ...

  6. Windows 10更新报错 0x8000ffff

    Windows 10更新报错 0x8000ffff - Microsoft Community 那么您可用 "Windows 10 覆盖安装" 来修复,可参考以下步伐,连接里有视频 ...

  7. windows使用问题(win10)

    常见问题 遇到修改文件夹名称被程序占用解决办法 1.ctrl+shift+esc进入任务管理器 2.打开性能-资源监视器 3.关联的句柄搜索框输入文件夹名称 4.搜查出来暂用文件夹程序选中右键将其关闭

  8. git添加github和gitee多个git地址管理

    1.git init //初始化当前的git地址 2.git remote add github github.com //git remote add git标识 git地址 3.git pull ...

  9. c#获取当前进程使用内存

    public static string GetMemory()        {            Process proc = Process.GetCurrentProcess();     ...

  10. 理解函数调用_arguments对象作为函数参数的别名

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...