上代码:
XXXFileEntity xxxFileEntity = xxxFileService.getById(id);
if (null == xxxFileEntity || xxxFileEntity.getDeleted()==1){
return Result.error("下载的内容不存在");
}
if (xxxFileEntity.getDownState()==0 || xxxFileEntity.getDownState()==3 ){
return Result.error("下载的内容暂不可下载,稍后重试");
}
String fileName = xxxFileEntity.getFileName();// 设置文件名,根据业务需要替换成要下载的文件名
if (fileName != null) {
//设置文件路径
String realPath = xxxFileEntity.getFilePath();
File file = new File(realPath,fileName);
if (file.exists()) {
String utf = "UTF-8";
// 设置响应
response.setContentType("application/ms-txt.numberformat:@");
response.setCharacterEncoding(utf);
response.setHeader("Pragma", "public");
response.setHeader("Cache-Control", "max-age=30");
response.setHeader("Access-Control-Expose-Headers","filename,Content-Disposition");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, utf));
response.setHeader("filename", URLEncoder.encode(fileName, utf));
byte[] buffer = new byte[1024];
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
os.write(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF});
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
System.out.println("download success");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
return null;
重点是请求头设置
response.setHeader("Access-Control-Expose-Headers","filename,Content-Disposition");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, utf));
response.setHeader("filename", URLEncoder.encode(fileName, utf));
设置前端可以查看的请求头
response.setHeader("Access-Control-Expose-Headers","filename,Content-Disposition");
下面写入文件名:
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, utf));
response.setHeader("filename", URLEncoder.encode(fileName, utf));
前端通过decodeURICompone进行文件名解码,通过a标签下载即可