js下载文件

132 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

今分享一下两个js下载文件的方法

方法一

利用axios下载首先接口设置返回的数据类型 responseType若不设置,会导致下载的文件可能打不开

export function download(){
    return request({ //封装过后的axios
        url:"",//后台接口地址
        method:"GET",//请求方式
        responseType:"blob"
    })
}

上面定义好方法后,这里使用

download().then(res=>{
    const blob = new Blob([res.data], {

    // 如何后端没返回下载文件类型,则需要手动设置:type: 'application/pdf;chartset=UTF-8' 表示下载文档为pdf,如果是word则设置为msword,excel为excel

    type: 'application/pdf;chartset=UTF-8'

    })

    //创建a标签

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

    // 兼容webkix浏览器,处理webkit浏览器中href自动添加blob前缀,默认在浏览器打开而不是下载

    const URL = window.URL || window.webkitURL

    // 根据解析后的blob对象创建URL 对象

    const herf = URL.createObjectURL(blob)

    // 下载链接

    a.href = herf

    // 下载文件名,如果后端没有返回,可以自己写a.download = '文件.pdf'

    a.download = "xxxxx.pdf"

    document.body.appendChild(a)

    a.click()

    document.body.removeChild(a)

    // 在内存中移除URL 对象

    window.URL.revokeObjectURL(herf)
})

方法二 自己封装请求区下载文件

download={
    downloadUr1File(url) {
        const xhr = new XMLHttpRequest();//调用XHR通过请求获取数据流
        xhr.open( 'GET", url, true );
        xhr.responseType = 'blob'; //响应类型blob字节流
        xhr.setRequestHeader( 'token ' , getToken());//传入token
        xhr.onload = () =>{
            if (xhr.status === 200) {
                //获取图片blob数据并保存responseURL
                var filename = xhr.responseURL.substring(xhr.responseURL.lastIndexOf("/")+1);
                this.saveAs(filename,xhr.response); //传入参数  filename 文件名   xhr.response 响应的blob
            }
        }
        xhr.send();//发送请求
    },
    saveAs(name,data) {
       var urlobject = window.URL;//window对象的URL对象是专门用来将blob或者file读取成
       var export_blob = new Blob([data]); //Blob对象可以看作是存放二进制数据的容器
       var save_link = document.createElement( 'a ');//创建a标签
       save_link.href = urlobject.createObjectURL(export_blob);//通过URL.createObjectURL;
       save_link.download = name;
       save_link.click();//触发a标签下载文件
    }
}

image.png

新手上来。自己理解写的 ,有错误的地方欢迎指出,感激不尽