后台接口返回void但是response有设置合适的相关信息,前端调用接口解析Blob数据下载excel文件

1、pom.xml文件增加依赖:

<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
        </dependency>

2、接口代码如下:

/**
     * 企业列表--导出
     */
    @GetMapping(value = "/downloadTenantList")
    public void downloadTenantList(HttpServletRequest request,HttpServletResponse response) {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        Workbook wb = new SXSSFWorkbook(500);
        Sheet sheet = wb.createSheet();
        wb.setSheetName(0,"企业");
        Row titleRow1 = sheet.createRow(0);
        titleRow1.setHeightInPoints(30);
        Cell titleCellID = titleRow1.createCell(0);
        titleCellID.setCellValue("ID");
        Cell titleCellName = titleRow1.createCell(1);
        titleCellName.setCellValue("名称");

        Row titleRow2 = sheet.createRow(1);
        titleRow2.setHeightInPoints(30);
        Cell valCellID2 = titleRow2.createCell(0);
        valCellID2.setCellValue("ID");
        Cell valCellName2 = titleRow2.createCell(1);
        valCellName2.setCellValue("名称");
        try
        {
            wb.write(response.getOutputStream());
        }
        catch (Exception e)
        {
            log.error("导出企业Excel异常{}", e.getMessage());
        }
        finally
        {
            IOUtils.closeQuietly(wb);
        }
    }

3、前端代码如下,可以作为参考,但需要根据实际情况整理

import { saveAs } from 'file-saver'
function blobValidate(data) {
  return data.type !== 'application/json'
}
/**
* 参数处理
* @param {*} params  参数
*/
export function tansParams(params) {
  let result = ''
  for (const propName of Object.keys(params)) {
    const value = params[propName];
    var part = encodeURIComponent(propName) + "=";
    if (value !== null && value !== "" && typeof (value) !== "undefined") {
      if (typeof value === 'object') {
        for (const key of Object.keys(value)) {
          if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') {
            let params = propName + '[' + key + ']';
            var subPart = encodeURIComponent(params) + "=";
            result += subPart + encodeURIComponent(value[key]) + "&";
          }
        }
      } else {
        result += part + encodeURIComponent(value) + "&";
      }
    }
  }
  return result
}
export function download(url, params, filename, config) {
  downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", })
  return service.post(url, params, {
    transformRequest: [(params) => { return tansParams(params) }],
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    responseType: 'blob',//使用这个或者{responseType:'arraybuffer'}
    ...config
  }).then(async (data) => {
    const isBlob = blobValidate(data);
    if (isBlob) {
      const blob = new Blob([data])
      saveAs(blob, filename)
    } else {
      const resText = await data.text();
      const rspObj = JSON.parse(resText);
      const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
      Message.error(errMsg);
    }
    downloadLoadingInstance.close();
  }).catch((r) => {
    console.error(r)
    Message.error('下载文件出现错误,请联系管理员!')
    downloadLoadingInstance.close();
  })
}
	

这样就可以通过调用接口的方式导出excel文件,请求接口就可以在header中设置认证头

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用Spring Boot和Servlet技术实现在前端调用后端接口下载文件,并且利用JavaScript实现进度条的展示。 以下是一个代码示例: 1. 后端代码 ```java @RestController public class FileDownloadController { @GetMapping("/download") public void downloadFile(HttpServletRequest request, HttpServletResponse response) throws IOException { String fileName = "your_file_name"; String fileUrl = "your_file_url"; URL url = new URL(fileUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置请求方式 conn.setRequestMethod("GET"); // 设置连接超时时间 conn.setConnectTimeout(5000); // 设置读取超时时间 conn.setReadTimeout(5000); // 设置请求头信息 conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"); // 获取文件总长度 int contentLength = conn.getContentLength(); response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName); response.setHeader("Content-Length", String.valueOf(contentLength)); InputStream inputStream = conn.getInputStream(); OutputStream outputStream = response.getOutputStream(); byte[] buffer = new byte[1024]; int bytesRead = 0; long bytesReadSum = 0; while ((bytesRead = inputStream.read(buffer)) != -1) { bytesReadSum += bytesRead; // 计算下载进度 int progress = (int) (bytesReadSum * 100 / contentLength); // 将下载进度写入response的header中,前端通过Header可以获取到下载进度 response.setHeader("X-Download-Progress", String.valueOf(progress)); outputStream.write(buffer, 0, bytesRead); } inputStream.close(); outputStream.close(); } } ``` 在代码中,您需要修改以下参数: - fileName: 下载到本地的文件名称。 - fileUrl: 下载文件的URL地址。 在代码中,将下载进度通过Header的X-Download-Progress写入response中,前端可以通过获取Header中的X-Download-Progress来获取下载进度。 2. 前端代码 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>File Download Example</title> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> <script> $(document).ready(function () { $("#download-button").click(function () { var url = "/download"; var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'blob'; xhr.onload = function (e) { if (this.status == 200) { var blob = this.response; var fileName = "your_file_name"; var a = document.createElement('a'); a.download = fileName; a.href = window.URL.createObjectURL(blob); $("body").append(a); a.click(); $(a).remove(); } }; xhr.onprogress = function (e) { if (e.lengthComputable) { var progress = parseInt(e.loaded / e.total * 100); $("#download-progress").text("Download Progress: " + progress + "%"); } }; xhr.send(); }); }); </script> </head> <body> <button id="download-button">Download File</button> <div id="download-progress"></div> </body> </html> ``` 在代码中,通过jQuery实现按钮的点击事件,并通过XMLHttpRequest发送GET请求,获取到文件流并下载到本地。同时,通过onprogress事件计算下载进度,并将进度显示在页面上。 注意:在实现前端下载文件时,需要将响应的Content-Type设置为application/octet-stream,并且设置Content-Disposition为attachment,这样浏览器就会弹出下载对话框。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值