js下载文件的几种方式,你学废了吗

项目中总是遇到各种下载文件的需求,记录一下我用的最多的三种方式,有更多方法请一定在评论区和大家分享哦。(友情提示:下面代码格式是react写法)

方式一:点击a标签直接下载。(有个弊端:下载失败的话会跳转)

<a href=url download>a标签下载</a>

方式二:点击按钮创建一个a标签来下载

 <button onClick={this.createLinkFirst}>创建a链接下载</button>
 createLinkFirst=()=> {
        //踩坑:
        //用户点击下载多媒体文件(图片/视频等),最简单的方式,如果url指向同源资源,是正常的。 
        // 如果url指向第三方资源,download会失效,表现和不使用download时一致——浏览器能打开的文件,浏览器会直接打开,不能打开的文件,会直接下载。浏览器打开的文件,可以手动下载。
        //解决方案一:将文件打包为.zip/.rar等浏览器不能打开的文件下载。
        //解决方案二:通过后端转发,后端请求第三方资源,返回给前端,前端使用file-saver等工具保存文件。
        // 如果url指向的第三方资源配置了CORS,download依然无效,但可以通过xhr请求获取文件,然后下载到本地。

        var a = document.createElement('a')
        a.href = url
        a.download = '企业信息.xlsx'//下载文件名称
        document.body.appendChild(a)
        a.click()
        a.remove()
    }

方式三:通过文件流方式下载

<button onClick={this.createLinkSecond}>文件流请求方式下载</button>
//  get 和 post两种方式
createLinkSecond=()=> {
        let url = 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png'   //请求的URl
        /**
         * @name: 下载
         * @msg: get请求 header传参
         * @param {type} 参数一般拼在url后面
         * @return: 
         */
        let xhr = new XMLHttpRequest();    //定义http请求对象
        xhr.open("get", url, true);
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xhr.setRequestHeader("AAA", 'value');  //头部参数 (参数名,值)
        xhr.send();
        xhr.responseType = "blob";  // 返回类型blob
        xhr.onload = function () {
            if (this.status === 200) {
                let blob = this.response;
                let a = document.createElement('a')
                let url = window.URL.createObjectURL(blob)
                 	a.href = url
                    a.download = '文件' + '.zip'; //下载文件名
                    a.click()
                    window.URL.revokeObjectURL(url)
                } else {
                    console.log('失败')
                }
          }

        /**
         * @name: 下载
         * @msg:  post请求  json传参
         * @param {type} 
         * @return: 
         */
        let params={
            a:'aa',
            b:'bb'
        }
        let xhr = new XMLHttpRequest();    //定义http请求对象
        xhr.open("post", url, true);
        xhr.setRequestHeader("Content-type", "application/json"); // json传参
        xhr.setRequestHeader("AAA", 'value');
        xhr.send(JSON.stringify(params));
        xhr.responseType = "blob";  // 返回类型blob
        xhr.onload = function () {
            if (this.status === 200) {
                let blob = this.response;
                let a = document.createElement('a')
                let url = window.URL.createObjectURL(blob)
                a.href = url
                a.download = '文件' + '.zip';  //下载文件名
                a.click()
                window.URL.revokeObjectURL(url)

            } else {
                console.log('失败')
            }
        }
  	}
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值