把某个文件夹下面的所有东西都打包并输出
controller
@RequestMapping("/downloadFile")
public void downloadFile(HttpServletResponse response) throws Exception {
zjtsProgramUpgradeRestService.downloadFile(response);
}
service
public void downloadFile(HttpServletResponse response) throws IOException {
//配置文件中获取
String basePath = PRAGRAME_BASE_TEMPLATE_PATH;
String downloadPath = basePath + File.separator + "下载产品配置信息获取引导手册.zip";
ZipUtil.compress(downloadPath, getFilePaths(basePath));
InputStream inputStream = null;
File zipFile = null;
try {
zipFile = new File(downloadPath);
inputStream = new FileInputStream(zipFile);
//把文件流写入客户端进行响应
response.setContentType("application/zip");
response.setHeader("Content-Length", String.valueOf(zipFile.length()));
response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode(downloadPath, "UTF-8"))));
readAndWrite(inputStream, response);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
inputStream.close();
}
if (zipFile != null) {
zipFile.delete();
}
}
}
/**
* 读写文件
*
* @param inputStream
* @param response
* @throws Exception
*/
private static void readAndWrite(InputStream inputStream, HttpServletResponse response) throws Exception {
OutputStream os = response.getOutputStream();
byte[] buffer = new byte[1024];
int i = inputStream.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = inputStream.read(buffer);
}
}
* 压缩文件工具类
package cn.com.goldwind.ercp.fas.util;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Expand;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* 压缩文件工具类
* @author wyf
* 2016年8月14日
*/
public class ZipUtil {
static final int BUFFER = 8192;
private static File zipFile;
/**
* 压缩单个或多文件方法
* @param zipPath 压缩后的文件路径
* @param srcPathName 要压缩的文件路径
* 参数srcPathName也可以定义成数组形式,需调用方把参数封装到数组中传过来即可
*/
public static void compress(String zipPath,String... srcPathName) {
//压缩后的文件对象
zipFile = new File(zipPath);
try {
//创建写出流操作
FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,new CRC32());
ZipOutputStream out = new ZipOutputStream(cos);
for(String srcPath:srcPathName){
//创建需要压缩的文件对象
File file = new File(srcPath);
if (!file.exists()){
throw new RuntimeException(srcPath + "不存在!");
}
/*
* (1)如果在zip压缩文件中不需要一级文件目录,定义String basedir = "";
* 下面的compress方法中当判断文件file是目录后不需要加上basedir = basedir + file.getName() + File.separator;
* (2)如果只是想在压缩后的zip文件里包含一级文件目录,不包含二级以下目录,
* 直接在这定义String basedir = file.getName() + File.separator;
* 下面的compress方法中当判断文件file是目录后不需要加上basedir = basedir + file.getName() + File.separator;
* (3)如果想压缩后的zip文件里包含一级文件目录,也包含二级以下目录,即zip文件里的目录结构和原文件一样
* 在此定义String basedir = "";
* 下面的compress方法中当判断文件file是目录后需要加上basedir = basedir + file.getName() + File.separator;
*/
//String basedir = file.getName() + File.separator;
String basedir = "";
compress(file, out, basedir);
}
out.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static void compress(File file, ZipOutputStream out, String basedir) {
/*
* 判断是目录还是文件
*/
if (file.isDirectory()) {
basedir += file.getName() + File.separator;
compressDirectory(file, out, basedir);
} else {
System.out.println("压缩:" + basedir + file.getName());
compressFile(file, out, basedir);
}
}
/**
* 压缩一个目录
*/
private static void compressDirectory(File dir, ZipOutputStream out, String basedir) {
if (!dir.exists()){
return;
}
File[] files = dir.listFiles();
for (int i = 0; i < files.length; i++) {
/* 递归 */
compress(files[i], out, basedir);
}
}
/**
* 压缩一个文件
*/
private static void compressFile(File file, ZipOutputStream out, String basedir) {
if (!file.exists()) {
return;
}
try {
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(file));
//创建Zip实体,并添加进压缩包
ZipEntry entry = new ZipEntry(basedir + file.getName());
out.putNextEntry(entry);
//读取待压缩的文件并写进压缩包里
int count;
byte data[] = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
bis.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 解压缩
* @param sourceFile 要解压缩的文件的路径
* @param destDir 解压缩后的目录路径
* @throws Exception
*/
public static void deCompress(String sourceFile,String destDir) throws Exception{
//创建需要解压缩的文件对象
File file = new File(sourceFile);
if (!file.exists()){
throw new RuntimeException(sourceFile + "不存在!");
}
//创建解压缩的文件目录对象
File destDiretory = new File(destDir);
if(!destDiretory.exists()){
destDiretory.mkdirs();
}
/*
* 保证文件夹路径最后是"/"或者"\"
* charAt()返回指定索引位置的char值
*/
char lastChar = destDir.charAt(destDir.length()-1);
if(lastChar!='/'&&lastChar!='\\'){
//在最后加上分隔符
destDir += File.separator;
}
unzip(sourceFile, destDir);
}
/**
* 解压方法
* 需要ant.jar
*/
private static void unzip(String sourceZip,String destDir) throws Exception{
try{
Project p = new Project();
Expand e = new Expand();
e.setProject(p);
e.setSrc(new File(sourceZip));
e.setOverwrite(false);
e.setDest(new File(destDir));
e.execute();
}catch(Exception e){
throw e;
}
}
}
总结:压缩文件的那个可以单独当成一个工具类来使用,这只是下载文件的一种实现方式,适合一级目录 如果文件夹下面还有文件夹就不适用了 需要用递归来实现