一次性下载多个文件,遇到问题:只能下载到第一个。
按照网上的解决思路,可以打包成一个文件下载,于是自己写了一个打压缩包下载的示例,供大家简单参考。
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
@RequestMapping(value="/batch/filedownload")
public Map<String,Object> fileBatchDownload(HttpServletResponse response,@RequestParam("id") String idd) throws IOException{
Map<String,Object> modelMap = new HashMap<>();
long id = Long.parseLong(idd);
Material material = iMaterialService.getOne(new QueryWrapper<Material>().select("APPENDIX_ADDRESS").eq("ID", id));
String appendixAddress = material.getAppendixAddress();
List<String> filePaths = getFilePaths(appendixAddress);
File tempFile = File.createTempFile("tempFile", "zip");
tempFile = putBatchFilesInZip(filePaths,tempFile);
//下载头设置。
// response.setContentType("application/force-download");//
try(OutputStream os = response.getOutputStream();
FileInputStream fis = new FileInputStream(tempFile)){
response.setHeader("content-type", "application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("压缩包.zip", "UTF-8"));
int len =0;
byte[] bt = new byte[5*1024];
while((len = fis.read(bt)) != -1) {
os.write(bt,0,len);
}
}catch(Exception e) {
e.printStackTrace();
throw new RuntimeException();
}finally {
tempFile.deleteOnExit();
}
modelMap.put("success", true);
return modelMap;
}
/**
* 方法说明将files打包放到一个zip中。
* @return
* @throws IOException
*/
public File putBatchFilesInZip(List<String> filePaths,File tempFile) throws IOException {
ZipOutputStream zos = new ZipOutputStream(tempFile);
for(String pathFile : filePaths) {
File inputFile = new File(pathFile);
try(FileInputStream fis = new FileInputStream(inputFile);){
//压缩文件中写入名称
ZipEntry entry = new ZipEntry(inputFile.getName());
zos.putNextEntry(entry);
// 向压缩文件中输出数据
int len = 0;
byte[] bt = new byte[5*1024];
while ((len = fis.read(bt)) != -1) {
//压缩文件中写入真正的文件流
zos.write(bt, 0, len);
}
}catch(Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
}
zos.flush();
zos.close();
return tempFile;
}
}
注意点:
1.引入的包是org.apache.tools.zip提供的,没有采用java.util自带的。好处是new FileInputStream(inputFile)参数可以是File类型。
2.io流初始化在try后面,try执行完毕会自动关闭流,代码逻辑更清楚,简单。
本人对io流知识并不是特别清楚,只会基本的调用,如果代码中使用不恰当的地方,请大家指出,我会虚心学习。