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();
    });
  }


前端      token文件下载

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!