前端处理下载

15 篇文章 0 订阅

一,后端文件流的形式(优点:简单)
url=拼接的url(接口url+param参数)
1,window.open(url)
缺陷:有被拦截的可能

2.利用a标签download属性实现下载,href为url

3.利用from实现下载(推荐使用)
直接贴代码

download(url){
            let from=document.createElement('from');
            let iframe=document.createElement('iframe');
            from.style.display=none;
            iframe.style.display=none;
            iframe.name='hide_iframe'
            from.action=url;
            from.method = 'post';
            form.target = 'hide_iframe';
            document.body.appendChild(iframe);
            document.body.appendChild(form).submit();
            document.body.removeChild(form);
}

iframe是处理下载失败的情况

二,后端返回二进制流(优点:方便拿到msg后台的下载成功或失败的提示信息)
1,直接调接口获取content (不需要再封装xhr)
注意 可能存在兼容问题,推荐一个博客地址(有兼容IE10+下载)

  //res 是后台返回的结果
	const content = res.data;
    const blob = new Blob([content]);
    const fileName = "下载文件名"; //下载的文件名称
    const blobUrl = window.URL.createObjectURL(blob);
    download(blobUrl) ;

function download(blobUrl) {
  const a = document.createElement('a');
  document.body.appendChild(a);
  a.style.display = 'none';
  a.download = '<文件名>';
  a.href = blobUrl;
  a.click();
  document.body.removeChild(a);
}

2,或者利用原生的XMLHttpRequest方法实现

//接口地址  url
//请求参数:json字符串   param
function request (url) {
    const req = new XMLHttpRequest();
    req.open('POST', url, true);
    req.responseType = 'blob';
    req.setRequestHeader('Content-Type', 'application/json');
    req.onload = function() {
      const data = req.response;
      const blob = new Blob([data]);
      const blobUrl = window.URL.createObjectURL(blob);
      download(blobUrl) ;
    };
    req.send(param);
  };
function download(blobUrl) {
  const a = document.createElement('a');
   document.body.appendChild(a);
  a.style.display = 'none';
  a.download = '<文件名>';
  a.href = blobUrl;
  a.click();
  document.body.removeChild(a);
}

三.后端返回byte字节
在请求接口时,请求头要加上responseType: ‘blob’

this.$axios.post('/api/xxx', params, {
  responseType: 'blob'
}).then((res) => {
//这里获取到文件字节
	const content = res.data;
    const blob = new Blob([content]);
    const fileName = "下载文件名"; //下载的文件名称
    const blobUrl = window.URL.createObjectURL(blob);
    download(blobUrl) ;
}).catch((err) => {
 
});
function download(blobUrl) {
  const a = document.createElement('a');
  document.body.appendChild(a);
  a.style.display = 'none';
  a.download = '<文件名>';
  a.href = blobUrl;
  a.click();
  document.body.removeChild(a);
}

注意:a.download = ‘<文件名>’; 需要加上后缀,否则可能会造成文件格式问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值