多文件打成zip直接在浏览器下载方法
@Override
public void downloadZip(Long reportId, HttpServletRequest request, HttpServletResponse response) {
//响应头的设置
response.setCharacterEncoding("utf-8");
response.setContentType("application/force-download");
ReportGeneration report = reportMapper.selectReportGenerationById(reportId);
//查询数据库获取文件信息
List<ReportGeneration> reports = getNowDayOrder(reportId);
//设置压缩包的名字
String downloadName = report.getSiteName() + ".zip";
try {
//downloadName需要根据浏览器转换
downloadName = FileUtils.setFileDownloadHeader(request,downloadName);
response.setHeader("Content-Disposition", "attachment;filename=" + downloadName + "");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//设置压缩流:直接写入response,实现边压缩边下载
ZipOutputStream zipos = null;
try {
zipos = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
zipos.setMethod(ZipOutputStream.DEFLATED); //设置压缩方法
} catch (Exception e) {
e.printStackTrace();
}
//循环将文件写入压缩流
DataOutputStream os = null;
String profile = RuoYiConfig.getProfile();
for(ReportGeneration dao : reports){
List<UniversalUploadFile> uufs = queryFiles(dao.getReportId());
if(uufs == null || uufs.size() < 1){
continue;
}
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日HH时mm分");
String star = formatter.format(dao.getStartTime());
for (UniversalUploadFile item : uufs){
String fileName = item.getFileName();
String filePath = profile + item.getFilePath();
String funCode = item.getFunCode();
File file = new File(filePath);
if (!file.exists()) {
continue;
}else{
try {
funCode = PhotoConstant.FILE_NAME.get(funCode);
//添加ZipEntry,并ZipEntry中写入文件流
zipos.putNextEntry(new ZipEntry(star + "/" + funCode + fileName));
os = new DataOutputStream(zipos);
InputStream is = new FileInputStream(file);
byte[] b = new byte[4096];
int length = 0;
while ((length = is.read(b)) != -1) {
os.write(b, 0, length);
}
is.close();
zipos.closeEntry();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//关闭流
try {
os.flush();
os.close();
zipos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
下载文件名重新编码
/**
* 下载文件名重新编码
*
* @param request 请求对象
* @param fileName 文件名
* @return 编码后的文件名
*/
public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException
{
final String agent = request.getHeader("USER-AGENT");
String filename = fileName;
if (agent.contains("MSIE"))
{
// IE浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
}
else if (agent.contains("Firefox"))
{
// 火狐浏览器
filename = new String(fileName.getBytes(), "ISO8859-1");
}
else if (agent.contains("Chrome"))
{
// google浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
else
{
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
前端处理
downloadZip(row) {
//直接访问接口并下载文件
window.location.href = process.env.VUE_APP_BASE_API + "/webReport/downloadZip/" + row.reportId;
},