1、,如果前端用link标签下载可以添加response.reset();
,这个response.reset();
可写可不写
/*
* @description: 文件下载
* @return
*/
@ApiOperation(value = "文件下载")
@GetMapping("/downloadGather/{id}")
public Result downloadGather(@PathVariable("id")Integer id,HttpServletResponse response){
try {
DocumentGatherVo byGather = gatherService.findByGather(id);
FileInputStream fis = new FileInputStream(Constant.gather_url+byGather.getNewFile());
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
response.setHeader("Content-Disposition","attchment;filename="+ URLEncoder.encode(byGather.getFileName(),"utf-8"));
BufferedOutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
response.setContentType("octet-stream");
outputStream.write(buffer);
outputStream.flush();
outputStream.close();
return null;
} catch (Exception e) {
e.printStackTrace();
}
return Result.result(400,false,"文件下载失败");
}
2、如果前端携带token下载会出现跨域,要添加:response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");对应下面的是response.setHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, HttpHeaders.CONTENT_DISPOSITION);
,这个response.reset();
就不需要写了,还是那句话response.reset();
可写可不写
/*
* @description: 文件下载
* @return
*/
@GetMapping(DOWNLOAD_PLANDISPOSE)
@ApiOperation(value = "文件下载")
public HttpResult downloadPlanDispose(@PathVariable("id")Integer id, HttpServletResponse response){
try {
PlanDispose planDispose = planDisposeService.getOne(new QueryWrapper<PlanDispose>().eq("id", id));
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(Constants.HISTORYALARM + planDispose.getNewFile()));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
response.addHeader(HttpHeaders.CONTENT_DISPOSITION,"attchment;filename="+ URLEncoder.encode(planDispose.getFileName(),"utf-8"));
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
//设置暴露头部信息(因为跨域访问默认不能获取全部头部信息)
response.setHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, HttpHeaders.CONTENT_DISPOSITION);
out.write(buffer);
out.flush();
out.close();
return null;
} catch (Exception e) {
e.printStackTrace();
}
return HttpResult.failed(400,"文件下载失败",null);
}
}
3、错误演示:
3.1、如果前端携带token下载是,response.reset() 与 response.setHeader("Access-Control-Expose-Headers", "Content-Disposition")
都写上的话,还有只写response.reset();
,不写response.setHeader("Access-Control-Expose-Headers", "Content-Disposition")
前端会出现以下错误:CORS跨域错误,后端没报错
解决办法:把response.reset()
去掉,添加头 response.setHeader("Access-Control-Expose-Headers", "Content-Disposition")