代码:
1、获取到批量下载的文件的路径和名称按同样顺序存储到两个集合中,使用时调用这个接口即可批量下载。
public void fileDownloads() throws IOException {
ArrayList<String> filepathList = new ArrayList<>();
ArrayList<String> documentNameList = new ArrayList<>();
HttpServletRequest servletRequest = this.getServletRequest();
HttpServletResponse servletResponse = this.getServletResponse();
String demandRecordId = this.getServletRequest().getParameter("demandRecordId");
DemandRecordAccessoryExample demandRecordAccessoryExample = new DemandRecordAccessoryExample();
demandRecordAccessoryExample.createCriteria().andDemandRecordIdEqualTo(demandRecordId);
List<DemandRecordAccessory> demandRecordAccessoryList = demandRecordAccessoryService.selectByExample(demandRecordAccessoryExample);
for (int i = 0; i < demandRecordAccessoryList.size(); i++) {
DemandRecordAccessory demandRecordAccessory = demandRecordAccessoryList.get(i);
String accessory = demandRecordAccessory.getAccessory();
if(StringUtils.isNotBlank(accessory)) {
filepathList.add(accessory);
List<String> result = Arrays.asList(accessory.split("_"));
String fileName = result.get(result.size() - 1);
String encodeFileName = URLEncoder.encode(fileName, "UTF-8");
documentNameList.add(encodeFileName);
}
}
batchDownLoadFile(servletRequest,servletResponse,"附件",filepathList,documentNameList);
}
2、将文件打包临时存储到服务器上,导出压缩包后再清除临时文件。
public static void batchDownLoadFile(HttpServletRequest request, HttpServletResponse response, String filename, ArrayList<String> filepath, ArrayList<String> documentname) {
byte[] buffer = new byte[1024];
Date date = new Date();
String path = "/Users/zhangjianlong/software/tomcat/webapps/picsserver";
String strZipPath = "/Users/zhangjianlong/software/tomcat/webapps/picsserver" +"/"+ filename +".zip";
File file = new File(path);
if (!file.isDirectory() && !file.exists()) {
file.mkdir();
}
try {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(strZipPath));
for (int i = 0; i < filepath.size(); i++) {
File f = new File(filepath.get(i));
FileInputStream fis = new FileInputStream(f);
System.out.println(documentname.get(i));
out.putNextEntry(new ZipEntry(documentname.get(i)));
out.setEncoding("GBK");
int len;
while ((len = fis.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
out.closeEntry();
fis.close();
}
out.close();
downLoadFile(request, response,strZipPath, filename + ".zip");
File temp = new File(strZipPath);
if (temp.exists()) {
temp.delete();
}
} catch (Exception e) {
e.printStackTrace();
}
}
3、将压缩包下载到本地。
public static void downLoadFile(HttpServletRequest request,HttpServletResponse response,String filePath ,String fileName){
try {
OutputStream outputStream = response.getOutputStream();
FileInputStream fileInputStream=new FileInputStream(new File(filePath));
response.reset();
String encodeFileName = URLEncoder.encode(fileName, "UTF-8");
response.addHeader("Content-Disposition", "attachment; filename=\"" + encodeFileName + "\"");
response.setContentType("application/octet-stream");
byte[] b = new byte[1024];
int len = -1;
while ((len = fileInputStream.read(b)) != -1) {
outputStream.write(b, 0, len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}