1.问题如下:
1.1 后台直接用get请求地址在浏览器访问可以下载;
1.2 跟前台交互后, 也是可以下载的, 但是一直无法打开! ( 查看响应结果为乱码 )
2.问题分析:
前端是直接通过ajax进行请求的,因为服务器端已经通过文件的形式响应给前端所以没有任何的json数据返回需要进行接收, 故无法下载;
3.解决办法:
①使用window.location.href = ‘url’;的方式进行请求,问题得到解决.
window.location.href = "http://localhost/down/template";
②设置响应类型: responseType: ‘blob’ ( 本人使用, 考虑到安全问题. )
axios({
url: '/down/template',
method: 'get',
responseType: 'blob'
}).then(res => {
const url = window.URL.createObjectURL(new Blob([res.data]));
const link = document.createElement('a');
link.style.display = 'none';
link.href = url;
link.setAttribute('download', '文件名称.xlsx');
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}).catch(err => {
console.log(err);
});
============================================================================================
附上后端代码如下:
public static void downTemplate(HttpServletResponse response) {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("文件名称", "UTF-8") + ".xlsx");
response.setHeader("Pragma", "public");
response.setHeader("Cache-Control", "no-store");
response.addHeader("Cache-Control", "max-age=0");
//使用的easyexcel.
Resource resource = new ClassPathResource("123.xlsx");
ExcelWriter writer = EasyExcel.write(response.getOutputStream()).withTemplate(resource.getInputStream()).build();
writer.finish();
}