java打包zip并下载_Java批量下载文件并zip打包

本文介绍了一个Java实现的批量文件下载功能,通过将选定的文件压缩为zip,然后利用浏览器下载。提供了ZipUtils工具类的详细代码,包括文件和目录的压缩、Base64加密解密以及文件解压缩等方法。
摘要由CSDN通过智能技术生成

客户需求:列表勾选需要的信息,点击批量下载文件的功能。这里分享下我们系统的解决方案:先生成要下载的文件,然后将其进行压缩,生成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 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 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 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 files = new ArrayList();

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如图:

a419393e7e80a0d5cb4b84fda52f9f4d.png

DEMO下载地址:https://dwz.cn/Jw3z6fVq

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值