1、如果项目是基于cookies的身份认证,不会存在这个问题,如果是前后端分离项目一般是在http头部带token认证,这个时候下载文件会提示401,没有办法下载
2、解决方案:将文件读取为base64返回,在前端生成文件
3、代码
后端:
/**
* 机号信息模板导出
* @return
*/
@RequestMapping("export")
@ResponseBody
public JSONObject export(HttpServletRequest request,
HttpServletResponse response) throws Exception{
JSONObject jsonObject = new JSONObject();
String exportFileName = "民航局机号导入模板";
jsonObject.put("filename", exportFileName);
ClassPathResource classPathResource = new ClassPathResource("/excel/airplaneImport.xlsx");
InputStream is = classPathResource.getInputStream();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
IOUtils.copy(is, outputStream);
jsonObject.put("fileBase64", Base64.encodeBase64String(outputStream.toByteArray()));
return jsonObject;
}
前端:
b64toBlob(b64Data, contentType, sliceSize) {
contentType = contentType || '';
sliceSize = sliceSize || 512;
const byteCharacters = atob(b64Data);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
const blob = new Blob(byteArrays, {type: contentType});
return blob;
}
downloadTemplate() {
// window.location.href = this.apiUrl + 'airplaneinfo/export';
const header = new Headers();
header.set('Authorization', this.headers.get('Authorization'));
header.set('Accept', 'application/octet-stream');
this.http.get(this.apiUrl + 'airplaneinfo/export', {
headers: this.headers
}).toPromise().then(response => {
console.log(response);
const filename = response.json().filename;
const base64file = response.json().fileBase64;
const blob = this.b64toBlob(base64file, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 0);
const a = document.createElement('a'); // 转换完成,创建一个a标签用于下载
a.download = filename;
a.href = window.URL.createObjectURL(blob); // 转成本地连接到blob文本
a.click();
});
}
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!