前端-基于a标签实现下载功能

        最近在一个项目中需要实现下载功能,在前期与后端多次联调尝试使用接口下载文件无果后,最后抱着试一试的心态使用了A标签下载,方法是有效的,但是有部分局限性!!!

        使用a标签实现下载的步骤如下:

    Download(url, title, artist) {
        const eleLink = document.createElement("a"); // 新建A标签
        eleLink.href = url; // 下载的路径
        eleLink.download = `${title} - ${artist}`;  // 设置下载的属性,可以为空
        eleLink.style.display = "none"; 
        document.body.appendChild(eleLink);
        eleLink.click(); // 触发点击事件
        document.body.removeChild(eleLink);
    }

        但是!!!!这个方法会有一个局限性!!!我们在使用a标签实现下载功能时,必须保证是在同源情况下,当发起请求的地址和所需下载文件的地址形成跨域情况时,此时A标签会形成跳转,而不是下载功能。

         如果要实现使用a标签跨域下载,可以使用下面的方法:

使用XMLHttpRequest解决

  • 可以发送跨域请求,在服务端允许的情况下;

  • 支持发送和接收二进制数据;

  • 新增formData对象,支持发送表单数据;

  • 发送和获取数据时,可以获取进度信息;

  • 可以设置请求的超时时间;

        使用方法如下:

        Download(url, title, artist) {
            var x = new XMLHttpRequest();
            x.open("GET", url, true);
            x.responseType = 'blob';
            x.onload = function () {
                const url = window.URL.createObjectURL(x.response)
                const eleLink = document.createElement("a");
                eleLink.href = url;
                eleLink.download = `${title} - ${artist}`;
                eleLink.style.display = "none";
                document.body.appendChild(eleLink);
                eleLink.click();
                document.body.removeChild(eleLink);
            }
            x.send();
        },

        是不是很简单~其实原理就是将文件转为blob文件流的形式,再下载。

        当然了,前端下载文件的方式并不只有这一种,更多的还是通过请求实现下载功能,这种方法感觉还是查那么点意思,如果后续学到更好的下载方式,会在本篇博客中补充哦 ~ 欢迎大家一起讨论~

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值