批量下载的思路是把需要下载的文件打包为一个zip文件,然后下载这个zip文件。待下载完成之后,在删除这个zip文件,具体代码如下:
public static void doZip(String sourceFile,ZipOutputStream zipOut) throws Exception {
//需要压缩的每个文件
File file = new File(sourceFile);
//压缩文件的名称
String fileName = file.getName();
//将文件转换为流
FileInputStream sourceInput = new FileInputStream(sourceFile);
// 读写缓冲区
byte[] bufferArea = new byte[1024 * 10];
//读入缓冲流,提高效率
BufferedInputStream bufferStream = new BufferedInputStream(sourceInput, 1024 * 10);
//zip包中的每一个文件项
ZipEntry zipEntry = new ZipEntry(fileName);
//表示当前文件信息流写入到zip包中的某个文件对象中
zipOut.putNextEntry(zipEntry);
int length = 0;
// 在任何情况下,b[0] 到 b[off] 的元素以及 b[off+len] 到 b[b.length-1]
// 的元素都不会受到影响。这个是官方API给出的read方法说明,经典!
while ((length = bufferStream.read(bufferArea, 0, 1024 * 10)) != -1) {
zipOut.write(bufferArea, 0, length);
}
//记得关闭流
if(sourceInput != null) {
sourceInput.close();
}
if(bufferStream != null) {
bufferStream.close();
}
//这里zip流不能关闭,因为这只是完成一个文件的压缩,应该在调用此方法外面关闭流
}
/**
* 调用压缩方法
* @throws FException
*/
public static void file2Zip(HttpServletResponse response,HttpServletRequest request) throws Exception {
List<String> files = new ArrayList<String>();
//这个就是压缩包文件放置的位置和文件名称,自己定义,比如:
String zipFilePath = "D:xx/xx/xx/我的zip.zip";
ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath));
//循环将文件传入doZip方法,进行压缩
for (String file : files) {
doZip(file,zipOut);
}
//上面这样就包所有的文件加入到了一个压缩包中了,现在需要关闭压缩流了
if(zipOut != null) {
zipOut.close();
}
//压缩好了之后,就可以下载这个压缩包文件,下载文件在前面的篇幅中已经介绍过,这里不在赘述
response.setHeader("Content-Disposition", "attchment;filename="+new String("我的压缩文件.zip".getBytes("UTF-8"),"iso-8859-1"));
ServletOutputStream outputStream = response.getOutputStream();
String file = zipFilePath;
FileInputStream inputStream = new FileInputStream(file);
IOUtils.copy(inputStream, outputStream);
if(inputStream != null) {
inputStream.close();
}
//下载完成之后,可以删除掉这个zip包
(new File(file)).delete();
}