Java批量下载文件并zip打包
客户需求:列表勾选需要的信息,点击批量下载文件的功能。这里分享下我们系统的解决方案:先生成要下载的文件,然后将其进行压缩,生成zip压缩文件,然后使用浏览器的下载功能即可完成批量下载的需求。以下是zip工具类:
package test; import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List; import org.apache.commons.codec.binary.Base64;
import org.apache.commons.collections.CollectionUtils;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /**
*
* 描述: ZipUtils.java
* @author 小当家
* @created 2017年10月27日
*/
public class ZipUtils { private static Logger logger = LoggerFactory.getLogger(ZipUtils.class); // 目录标识判断符
private static final String PATCH = "/";
// 基目录
private static final String BASE_DIR = "";
// 缓冲区大小
private static final int BUFFER = 2048;
// 字符集
private static final String CHAR_SET = "GBK"; /**
*
* 描述: 压缩文件
* @author 小当家
* @created 2017年10月27日
* @param fileOutName
* @param files
* @throws Exception
*/
public static void compress(String fileOutName, List<File> files) throws Exception {
try {
FileOutputStream fileOutputStream = new FileOutputStream(fileOutName);
ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);
zipOutputStream.setEncoding(CHAR_SET); if (files != null && files.size() > 0) {
for (int i = 0,size = files.size(); i < size; i++) {
compress(files.get(i), zipOutputStream, BASE_DIR);
}
}
// 冲刷输出流
zipOutputStream.flush();
// 关闭输出流
zipOutputStream.close();
} catch (Exception e) {
throw new Exception(e.getMessage(),e);
}
} /**
*
* 描述:压缩文件并进行Base64加密
* @author 小当家
* @created 2017年10月27日
* @param files
* @return
* @throws Exception
*/
public static String compressToBase64(List<File> files) throws Exception {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ZipOutputStream zipOutputStream = new ZipOutputStream(bos);
zipOutputStream.setEncoding(CHAR_SET); if (files != null && files.size() > 0) {
for (int i = 0,size = files.size(); i < size; i++) {
compress(files.get(i), zipOutputStream, BASE_DIR);
}
}
// 冲刷输出流
zipOutputStream.flush();
// 关闭输出流
zipOutputStream.close(); byte[] data = bos.toByteArray();
return new String(Base64.encodeBase64(data));
} catch (Exception e) {
throw new Exception(e.getMessage(),e);
}
} /**
*
* 描述: 压缩
* @author 小当家
* @created 2017年10月27日
* @param srcFile
* @param zipOutputStream
* @param basePath
* @throws Exception
*/
public static void compress(File srcFile, ZipOutputStream zipOutputStream, String basePath) throws Exception {
if (srcFile.isDirectory()) {
compressDir(srcFile, zipOutputStream, basePath);
} else {
compressFile(srcFile, zipOutputStream, basePath);
}
} /**
*
* 描述:压缩目录下的所有文件
* @author 小当家
* @created 2017年10月27日
* @param dir
* @param zipOutputStream
* @param basePath
* @throws Exception
*/
private static void compressDir(File dir, ZipOutputStream zipOutputStream, String basePath) throws Exception {
try {
// 获取文件列表
File[] files = dir.listFiles(); if (files.length < 1) {
ZipEntry zipEntry = new ZipEntry(basePath + dir.getName() + PATCH); zipOutputStream.putNextEntry(zipEntry);
zipOutputStream.closeEntry();
} for (int i = 0,size = files.length; i < size; i++) {
compress(files[i], zipOutputStream, basePath + dir.getName() + PATCH);
}
} catch (Exception e) {
throw new Exception(e.getMessage(), e);
}
} /**
*
* 描述:压缩文件
* @author 小当家
* @created 2017年10月27日
* @param file
* @param zipOutputStream
* @param dir
* @throws Exception
*/
private static void compressFile(File file, ZipOutputStream zipOutputStream, String dir) throws Exception {
try {
// 压缩文件
ZipEntry zipEntry = new ZipEntry(dir + file.getName());
zipOutputStream.putNextEntry(zipEntry); // 读取文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); int count = 0;
byte data[] = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
zipOutputStream.write(data, 0, count);
}
bis.close();
zipOutputStream.closeEntry();
} catch (Exception e) {
throw new Exception(e.getMessage(),e);
}
} /**
*
* 描述: 文件Base64加密
* @author 小当家
* @created 2017年10月27日 上午9:27:38
* @param srcFile
* @return
* @throws Exception
*/
public static String encodeToBASE64(File srcFile) throws Exception {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
// 读取文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile)); int count = 0;
byte data[] = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
bos.write(data, 0, count);
}
bis.close(); byte[] base64Data = Base64.encodeBase64(bos.toByteArray());
if (null == base64Data) {
bos.close();
return null;
} bos.close();
return new String(base64Data, CHAR_SET);
} catch (Exception e) {
throw new Exception(e.getMessage(),e);
}
} /**
*
* 描述: 文件Base64解密
* @author 小当家
* @created 2017年10月27日
* @param destFile
* @param encodeStr
* @throws Exception
*/
public static void decodeToBase64(File destFile, String encodeStr) throws Exception {
try {
byte[] decodeBytes = Base64.decodeBase64(encodeStr.getBytes()); ByteArrayInputStream bis = new ByteArrayInputStream(decodeBytes);
// 读取文件
FileOutputStream fileOutputStream = new FileOutputStream(destFile); int count = 0;
byte data[] = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
fileOutputStream.write(data, 0, count);
}
fileOutputStream.close();
bis.close();
} catch (Exception e) {
throw new Exception(e.getMessage(),e);
}
} /**
*
* 描述: 解压缩
* @author 小当家
* @created 2017年10月27日
* @param srcFileName
* @param destFileName
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static void decompress(String srcFileName, String destFileName) throws Exception {
try {
ZipFile zipFile = new ZipFile(srcFileName);
Enumeration<ZipEntry> entries = zipFile.getEntries();
File destFile = new File(destFileName);
InputStream inputStream = null; while(entries.hasMoreElements()) {
ZipEntry zipEntry = (ZipEntry)entries.nextElement();
String dir = destFile.getPath() + File.separator + zipEntry.getName();
File dirFile = new File(dir); if (zipEntry.isDirectory()) {
dirFile.mkdirs();
} else {
fileProber(dirFile);
inputStream = zipFile.getInputStream(zipEntry);
decompressFile(dirFile, inputStream);
}
}
zipFile.close();
} catch (Exception e) {
throw new Exception(e.getMessage(),e);
}
} /**
*
* 描述: 解压文件
* @author 小当家
* @created 2017年10月27日
* @param destFile
* @param inputStream
* @throws Exception
*/
private static void decompressFile(File destFile, InputStream inputStream) throws Exception {
try {
// 文件输入流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile)); int count = 0;
byte data[] = new byte[BUFFER];
while ((count = inputStream.read(data, 0, BUFFER)) != -1) {
bos.write(data, 0, count);
}
bos.close();
inputStream.close();
} catch (Exception e) {
throw new Exception(e.getMessage(), e);
}
} /**
*
* 描述:文件探测
* @author 小当家
* @created 2017年10月27日
* @param dirFile
*/
private static void fileProber(File dirFile) {
File parentFile = dirFile.getParentFile();
if (!parentFile.exists()) {
// 递归寻找上级目录
fileProber(parentFile);
parentFile.mkdir();
}
} public static void main(String[] args) {
try {
ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(new File("D:/a/a.zip")));
zipOutputStream.setEncoding(CHAR_SET); List<File> files = new ArrayList<File>();
files.add(new File("D:/a/1.xls"));
files.add(new File("D:/a/2.xls"));
files.add(new File("D:/a/1.java")); if (CollectionUtils.isEmpty(files) == false) {
for (int i = 0,size = files.size(); i < size; i++) {
compress(files.get(i), zipOutputStream, BASE_DIR);
}
}
// 冲刷输出流
zipOutputStream.flush();
// 关闭输出流
zipOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
所需要的jar包:
ant-1.9.4.jar
commons-codec-1.10.jar
commons-collections-3.2.2.jar
log4j-1.2.17.jar
slf4j-api-1.7.21.jar
slf4j-log4j12-1.7.21.jar
例子中最后会压缩成一个a.zip如图:

Java批量下载文件并zip打包的更多相关文章
- java批量下载文件为zip包
批量下载文件为zip包的工具类 package com.meeno.trainsys.util; import javax.servlet.http.HttpServletRequest; impor ...
- asp.net怎样实现批量下载文件(非打包形式下载)
问题: 我想实现的是一个一个的下载. 比如我有一个文件列表.通过checkbox选择.通过单击下载按钮下载选中文件. 百度到都是用打包形式实现批量下载. 这是我自己写的代码,但是点击下载后只能下载一个 ...
- java+批量下载文件到指定文件夹
需求 导出文件后存留在了服务器中,需要提供下载按钮,点击后可下载到本地:(因为涉及多个文件,下载前先将文件进行压缩,提供下载压缩文件) 效果预览 代码 主要方法 /** * 下载生成的所有在线 ...
- 批量下载文件web
最近需要这个所以写了一个例子一般批量下载由以下步骤组成: 1.确定下载的源文件位置 2.对文件进行打包成临时文件,这里会用到递归调用,需要的嵌套的文件夹进行处理,并返回文件保存位置 3.将打包好的文件 ...
- C#异步批量下载文件
C#异步批量下载文件 实现原理:采用WebClient进行批量下载任务,简单的模拟迅雷下载效果! 废话不多说,先看掩饰效果: 具体实现步骤如下: 1.新建项目:WinBatchDownload 2.先 ...
- java批量下载,将多文件打包成zip格式下载
现在的需求的: 根据产品族.产品类型,下载该产品族.产品类型下面的pic包: pic包是zip压缩文件: t_product表: 这些包以blob形式存在另一张表中: t_imagefile表: 现在 ...
- java多线程批量下载文件
多线程下载文件 平时开发中有时会用到文件下载,为了提高文件的下载速率,采用多线程下载能够达到事半功倍的效果: package test; /** * 文件下载类 * @author luweichen ...
- java+根据多个url批量下载文件
1.基本流程 当我们想要下载网站上的某个资源时,我们会获取一个url,它是服务器定位资源的一个描述,下载的过程有如下几步: (1)客户端发起一个url请求,获取连接对象. (2)服务器解析url,并且 ...
- java+web+批量下载文件
JavaWeb 文件下载功能 文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端,所以文件下载需要IO技术将服务器端的文件读取到,然后写到response缓冲区中,然后再下载到个人客户端. 1 ...
随机推荐
- 《Linux就该这么学》培训笔记_ch00_认识Linux系统和红帽认证
<Linux就该这么学>培训笔记_ch00_认识Linux系统和红帽认证 文章最后会post上书本的笔记照片. 文章主要内容: 认识开源 Linux系统的种类及优势特性 认识红帽系统及红帽 ...
- Keras 中的 verbose 参数
在 fit( ) 和 evaluate( ) 中 都有 verbose 这个参数,但都是表示日志显示的参数. 具体如下: fit( ) 中 的 verbose 参数: verbose:日志显示ver ...
- LOJ3124 CTS2019 氪金手游 概率、容斥、树形DP
传送门 D2T3签到题可真是IQ Decrease,概率独立没想到然后就20pts滚粗了 注意题目是先对于所有点rand一个权值\(w\)然后再抽卡. 先考虑给出的关系是一棵外向树的情况.那么我们要求 ...
- 给电脑提升权限---- 切换为administrator
在装系统的时候我们都会在安装的时候进行创建用户这一操作,安装软件的时候总会出现权限不足的情况, 个人建议:如果你要是比较会使用电脑的话,可以体验一下超级管理员这一角色, 就是安装好了之后,切换为超级管 ...
- 第十七节:.Net Core中新增HttpClientFactory的前世今生
一. 背景 1.前世 提到HttpClient,在传统的.Net版本中简直臭名昭著,因为我们安装官方用法 using(var httpClient = new HttpClient()),当然可以Di ...
- JAVA并发编程: CAS和AQS
版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/u010862794/article/details/72892300 说起JAVA并发编程,就不得不聊 ...
- 解决:ElasticSearch ClusterBlockException[blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];
简记 使用SkyWalking用ES做存储,发现运行一段时间会提示ElasticSearch ClusterBlockException[blocked by: [FORBIDDEN/12/index ...
- .Net 如何使用Nlog
NLog是一个简单灵活的.NET日志记录类库,NLog的API非常类似于log4net,且配置方式非常简单.通过使用NLog,我们可以在任何一种.NET语言中输出带有上下文的调试信息,根据项目需求配置 ...
- HTML中的元素是有属性的:标准与解释器
元素的属性只有有标准和相应的解释器才有存在的意义. HTML中的元素是有属性的:这些额外的属性值可以配置元素或者以各种方式来调整元素的行为,进而满足用户所需的标准. https://developer ...
- SQL Server的唯一键和唯一索引会将空值(NULL)也算作重复值
我们先在SQL Server数据库中,建立一张Students表: CREATE TABLE [dbo].[Students]( ,) NOT NULL, ) NULL, ) NULL, [Age] ...