文件下载时,我想下载多个文件,思路当然是把多个文件压缩到一个文件然后下载。如果用户选中文件夹下载呢,就是将文件夹内的所有文件按照原有文件结构压缩下载,如果用户勾选的既要下载文件,又要下载文件夹,这个时候我就封装了一个方法。
/**
* 功能:压缩多个文件,文件夹成一个zip文件
* @param srcfile:源文件列表
* @param zipfile:压缩后的文件
* @param bases:文件对应的压缩路径
*/
public static void zipFileFolders(List<File> srcfile, File zipfile,Map<String,String> bases) {
byte[] buf = new byte[1024];
ZipOutputStream out = null;
try {
//ZipOutputStream类:完成文件或文件夹的压缩
out = new ZipOutputStream(new FileOutputStream(zipfile));
for (int i = 0; i < srcfile.size(); i++) {
FileInputStream in = new FileInputStream(srcfile.get(i));
String filePath = bases.get(srcfile.get(i).getAbsolutePath());
if(filePath==null)
filePath = "";
else
filePath += "/";
out.putNextEntry(new ZipEntry(filePath+srcfile.get(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();
}
}
代码测试
public static void main(String args[]) {
System.out.println("压缩测试");
String path = "E:\\hello";
ArrayList<File> files = getFiles(path);
Map<String,String> bases = new HashMap<>();
for (int i = 0; i < files.size(); i++) {
File s = files.get(i);
String value = s.getPath().substring(s.getPath().indexOf("\\")+1); // 转为相对路径
bases.put(s.getAbsolutePath(), value);
}
File zip = new File("E:\\hello.zip");
zipFileFolders(files,zip,bases);
}
/**
* 读取某个目录下所有文件、文件夹
* @param path
* @return
*/
public static ArrayList<File> getFiles(String path) {
ArrayList<File> files = new ArrayList<File>();
File file = new File(path);
File[] tempList = file.listFiles();
for (int i = 0; i < tempList.length; i++) {
if (tempList[i].isFile()) {
files.add(tempList[i]);
}
if (tempList[i].isDirectory()) {
ArrayList<File> files1 = getFiles(tempList[i].getPath());
files.addAll(files1);
}
}
return files;
}
srcfile
bases