JavaScript下载文件导出到本地的两种实现方式

 更新时间:2026年02月03日 09:47:13   作者:辰风沐阳  
本文介绍了JavaScript中文件下载的两种实现方式,浏览器对文件处理取决于类型和服务器的响应头设置,zip/docx等文件会触发下载,而图片/视频等会在浏览器中打开,文章提供了两种下载方案,需要的朋友可以参考下

前言

JavaScript 点击跳转文件地址时,有的文件会直接下载,而有的文件则在浏览器中直接打开,这主要取决于浏览器对文件类型的处理方式和服务器的响应头设置

浏览器对文件类型的处理

  • 需要下载的文件:zip、docx 等文件,通常会触发下载
  • 可在浏览器中打开的文件:图片(png、jpg)、视频(mp4)、文本文件(txt)等,浏览器会尝试打开这些文件

跨域和安全策略

  • 如果文件来自不同域名,浏览器的安全策略(CORS)可能会影响文件的处理方式
  • 某些文件可能因为安全原因被浏览器阻止直接打开,从而触发下载

a 标签的 download 属性

通过动态创建一个 a 标签,并设置 href 和 dowload 属性来触发下载

适用于同源或支持 cors 的跨域文件下载,也可以下载一个 base64 格式的文件

function download(url, fileName) {
    const a = document.createElement("a")
    a.href = url
    a.download = fileName
    a.click()
}

使用示例:后端接口返回一个 base64 格式的二维码图片,前端按钮需要实现点击按钮将图片下载到本地的功能

download('data:image/png;base64,iVBORwxxxxx', 'qrcode.png')

将网络地址文件下载到本地

从指定 URL 下载文件并触发并触发浏览器的下载行为,这种实现方式可以绕过浏览器的同源策略限制

  • 检测 url 地址,然后获取文件名称
  • 使用 XMLHttpRequest 发起文件下载请求
  • onreadystatechange 下载状态监控,监听请求状态变化
  • onload 处理下载完成后的逻辑,请求成功时创建一个 a 标签触发浏览器的下载行为
// 下载文件并导出本地
function downloadFile(url, name = '') {
    // 检测文件地址
    if (url.substr(0, 4) !== 'http') {
        throw new Error("请传入一个网络地址");
    }
    // 获取文件名称
    let fileName;
    if (name) {
        const index = url.lastIndexOf('.')
        fileName = name + (index === -1 ? url : url.substr(index))
    } else {
        const index = url.lastIndexOf('/')
        fileName = index === -1 ? url : url.substr(index + 1)
    }
    // 执行文件下载
    const xhr = new XMLHttpRequest();
    xhr.open("GET", url, true);
    xhr.responseType = 'blob';
    xhr.onload = () => {
        if (xhr.status === 200) {
            const url = window.URL.createObjectURL(xhr.response)
            const a = document.createElement('a');
            a.href = url
            a.download = fileName
            a.click()
        } else {
            console.log('文件下载失败');
        }
    }
    xhr.onreadystatechange = () => {
        if (xhr.readyState === 4) {
            if (xhr.status == 200) {
                console.log('文件下载成功');
            }
        } else if (xhr.readyState === 3) {
            console.log('文件下载中');
        }
    }
    xhr.send();
}

使用示例:

// 下载文件(导出时默认使用原文件名)
downloadFile('https://img.xxx.com/thumb/xxxx.png')
// 下载文件,并且指定文件名称(不需要写文件后缀名,会自动拼接)
downloadFile('https://img.xxx.com/thumb/xxxx.png', 'qrcode')

到此这篇关于JavaScript下载文件导出到本地的两种实现方式的文章就介绍到这了,更多相关JavaScript下载文件导出到本地内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 举例说明javascript冒泡排序

    举例说明javascript冒泡排序

    这篇文章主要为大家介绍了javascript冒泡排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • 使用JavaScript实现图片的自动轮播

    使用JavaScript实现图片的自动轮播

    在网站开发中,经常会遇到需要展示多张图片并自动切换的需求,这就需要使用JavaScript来实现图片的自动轮播功能,本文将通过一个简单的例子,演示如何用JavaScript实现图片的自动轮播,感兴趣的同学可以自己动手试一试
    2023-09-09
  • BootStrap table实现表格行拖拽效果

    BootStrap table实现表格行拖拽效果

    这篇文章主要为大家详细介绍了BootStrap table实现表格行拖拽效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • JavaScript重定向URL参数的两种方法小结

    JavaScript重定向URL参数的两种方法小结

    关于JavaScript重定向URL参数的实现方法网站有很多,这篇文章的主要内容是从网上查找,并进行了修改,简单粗暴的实现使用JavaScript重置url参数,文中给出了详细的示例代码和调用代码,对大家的理解和学习很有帮助,感兴趣的朋友们下面来一起看看吧。
    2016-10-10
  • IE8下关于querySelectorAll()的问题

    IE8下关于querySelectorAll()的问题

    在IE8的新特性里,提到了会支持querySelector()和querySelectorAll()方法,如何使用这里就不说了,只是记录下我在使用时遇到一个问题。
    2010-05-05
  • TypeScript对于Duck类型和模块命名空间应用

    TypeScript对于Duck类型和模块命名空间应用

    这篇文章主要介绍了TypeScript对于Duck类型和模块命名空间应用,Duck类型是一种动态类型和多态形式,在duck类型中,重点是对象的行为可以做什么,而不是对象所属的类型
    2022-08-08
  • 微信小程序实现pdf、word等格式文件上传的方法

    微信小程序实现pdf、word等格式文件上传的方法

    这篇文章主要介绍了微信小程序实现pdf,word等格式文件上传的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • JS利用原生canvas实现图形标注功能

    JS利用原生canvas实现图形标注功能

    这篇文章主要为大家详细介绍了JS如何利用原生canvas实现图形标注功能,支持矩形、多边形、线段、圆形等已绘制的图形进行缩放,移动,需要的可以参考下
    2024-03-03
  • 微信小程序以ssm做后台开发的实现示例

    微信小程序以ssm做后台开发的实现示例

    这篇文章主要介绍了微信小程序以ssm做后台开发的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 了解Javascript中函数作为对象的魅力

    了解Javascript中函数作为对象的魅力

    这篇文章主要介绍了了解Javascript中函数作为对象的魅力,javascript中函数可以有属性,可以有方法, 可以享有所有对象所拥有的特性。并且最重要的,她还可以直接被调用,需要的朋友可以参考下
    2019-06-06

最新评论