设计思路:
1.本地先创建一个zip文件
2.将批量下载的文件依次放入zip文件中
3.将zip文件返回给前端
//一、本地先生成zip文件
//要批量下载的文件id数组
String[] ids = new String[] {"1","2"}
byte[] buffer = new byte[1024];
//创建zip
String localZipFile = "D:/temp/test.zip" ;
if(!new File(localZipFile).exists()){
new File(localZipFile).mkdirs();
}
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(localZipFile));
//依次获取批量下载的文件
for(int i =0; i<ids.length;i++){
//设置压缩包内的文件的字符编码,不然文件名可能变成乱码(用户为windows系统)
out.setEncoding("GBK");
//从数据库中获取文件的路径和文件名,并放入zip文件中
String fileId = ids[i];
Map<String,Object> map =exportManagerService.getFjInfo(fileId);
FileInputStream inStream = new FileInputStream(new File(map.get("path").toString()));
out.putNextEntry(new ZipEntry(map.get("name").toString()));
int len;
//读入需要下载的文件的内容,打包到zip文件
while ((len = inStream.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
out.closeEntry();
inStream.close();
}
out.close();
this.downFile(response,"D:/temp","test.zip");
//二、将本地zip返回给前端
private void downFile(HttpServletResponse response,String FilePath, String str) {
Map m = new HashMap();
try {
String path = FilePath +"/"+ str;
File file = new File(path);
if (file.exists()) {
InputStream ins = new FileInputStream(path);
BufferedInputStream bins = new BufferedInputStream(ins);// 放到缓冲流里面
OutputStream outs = response.getOutputStream();// 获取文件输出IO流
BufferedOutputStream bouts = new BufferedOutputStream(outs);
response.addHeader("content-disposition", "attachment;filename="
+ java.net.URLEncoder.encode(str, "UTF-8"));
int bytesRead = 0;
byte[] buffer = new byte[8192];
// 开始向网络传输文件流
while ((bytesRead = bins.read(buffer, 0, 8192)) != -1) {
bouts.write(buffer, 0, bytesRead);
}
bouts.flush();// 这里一定要调用flush()方法
ins.close();
bins.close();
outs.close();
bouts.close();
}
} catch (IOException e) {
m.put("code", "-1");
m.put("text", "附件下载出错:" + e.getMessage());
e.printStackTrace();
}
}
版权声明:本文为weixin_42488402原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。