get请求-文件流下载

3,062 阅读1分钟

直接请求然后下载一些文件到本地,如果直接发送请求,后端返回文件流,这个时候在http响应报文中是看不到具体的返回data的。所以首先我们需要在请求的时候设置 responseType: 'blob',这里涉及到get请求和post请求的一些区别,例如get请求:

    function downFile(params) {
      return http({
        url: '/downFile',
        method: 'GET',
        params,
        responseType: 'blob',
        headers: {
          'content-disposition': 'attachment;filename=total.xls',
          'content-type': 'application/octet-stream;charset=utf-8'
        }
      });
    }

这样就能获取到响应报文为Blob格式,接下来就需要操作响应体:

function download(data, filename = '好一个大憨憨') {
  console.log(data, 'resss');
  // var blob = new Blob([data], { type: 'application/vnd.ms-excel' }); //接收的是blob,若接收的是文件流,需要转化一下
  if (typeof window.chrome !== 'undefined') {
    var link = document.createElement('a');
    link.href = window.URL.createObjectURL(data);
    link.download = filename;
    link.click();
  } else if (typeof window.navigator.msSaveBlob !== 'undefined') {
    // IE version
    var blob = new Blob([data], { type: 'application/force-download' });
    window.navigator.msSaveBlob(blob, filename);
  } else {
    // Firefox version
    var file = new File([data], filename, {
      type: 'application/force-download'
    });
    window.open(URL.createObjectURL(file));
  }
}

这样的方式前端能控制下载文件的名字

其实这种get请求有一种更简单的方式,就是如果直接在浏览器上输入这个请求url其实也可以直接下载,例如:

let token = location.getItme('项目token')
window.open(`api/apply/downFile?token=${token}`);

这种情况是直接下载文件,文件名是后端上传到服务器的源文件 这种其实更简单啦,相对地址会自动获取域名的啦!

好啦! 工作中遇到的一些小坑,然后埋完记录一下心得。江湖路远-再见咯!