JS原生ajax文件流下载文件(优化版未测试)

import ElementUI from 'element-ui';  // 依赖ElementUI

// url:接口地址 params: 参数 method:请求方式(GET,POST) name:下载文件名称需要携带后缀名(例:下载文件.doc)

export function downFile(url, params, method, name) {

    let Loading;

    Loading = ElementUI.Loading.service({

        fullscreen: true,

        text: '数据处理中,请稍后!!!'

    })

    let methods = method.toUpperCase()

    //默认登录token

    let token = window.localStorage.getItem('token')

    var xhr = new XMLHttpRequest();

    xhr.open(methods, url, true);        // 也可以使用POST方式,根据接口

    xhr.responseType = "blob";    // 返回类型blob

    xhr.setRequestHeader("token", token);

    xhr.setRequestHeader('Content-type', 'application/json')

    // 发送ajax请求

    methods === 'GET' ? xhr.send() : xhr.send(JSON.stringify(params))

    xhr.onload = function () {

        // 请求完成

        if (this.status == 200) {

            // 返回201

            if (this.response.size < 150) {

                Loading.close()

                // 暂无数据

                return false

            }

            var blob = this.response;

            var reader = new FileReader();

            reader.readAsDataURL(blob);    // 转换为base64,可以直接放入a标签href

            reader.onload = function (e) {

                // 转换完成,创建一个a标签用于下载

                var a = document.createElement('a');

                a.download = name

                a.href = e.target.result;

                // 修复firefox中无法触发click

                a.click();

            }


            // 如果下载不成功 可使用以下方法

            // const url = window.URL.createObjectURL(blob)

            // const a = document.createElement('a')

            // a.href = url

            // a.download = name

            // a.click()

            Loading.close()

        } else {

            Loading.close()

            ElementUI.$message.error('导出文件失败,请联系管理人员')

        }

    };

}

https://www.jianshu.com/p/7e9dc9d4edb3 老版本已测试

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。