当前位置:首页 > JavaScript

js实现文件下载

2026-01-12 13:10:55JavaScript

使用 a 标签下载文件

通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。

function downloadFile(url, filename) {
  const a = document.createElement('a');
  a.href = url;
  a.download = filename || 'download';
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
}

通过 Blob 对象下载文本或数据

将文本或二进制数据转换为 Blob 对象并生成下载链接。

function downloadTextAsFile(text, filename) {
  const blob = new Blob([text], { type: 'text/plain' });
  const url = URL.createObjectURL(blob);
  downloadFile(url, filename);
  setTimeout(() => URL.revokeObjectURL(url), 100);
}

下载后端返回的二进制流

处理 API 返回的二进制数据(如 PDF/Excel),通常需要设置正确的响应类型。

fetch('/api/download')
  .then(response => response.blob())
  .then(blob => {
    const url = URL.createObjectURL(blob);
    downloadFile(url, 'document.pdf');
    setTimeout(() => URL.revokeObjectURL(url), 100);
  });

处理跨域文件下载

当下载跨域资源时,可能需要将文件内容先获取到前端再生成下载。

fetch('https://example.com/file', { mode: 'cors' })
  .then(response => response.blob())
  .then(blob => {
    if (blob.size === 0) throw new Error('Empty response');
    const url = URL.createObjectURL(blob);
    downloadFile(url, 'cross-origin-file');
  });

大文件分块下载

对于大文件下载可以显示进度条,使用 Content-Length 和已接收字节数计算进度。

function downloadWithProgress(url, filename) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'blob';

    xhr.onprogress = (e) => {
      if (e.lengthComputable) {
        const percent = Math.round((e.loaded / e.total) * 100);
        console.log(`Downloaded: ${percent}%`);
      }
    };

    xhr.onload = () => {
      if (xhr.status === 200) {
        const blob = xhr.response;
        const url = URL.createObjectURL(blob);
        downloadFile(url, filename);
        resolve();
      }
    };

    xhr.send();
  });
}

注意事项

  • 移动端浏览器可能限制程序化下载行为
  • download 属性在同源策略限制下可能失效
  • 及时调用 URL.revokeObjectURL() 释放内存
  • 某些浏览器对 Blob URL 有大小限制
  • 考虑添加下载失败的错误处理逻辑

js实现文件下载

标签: 文件js
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 //…

js实现

js实现

JavaScript 实现方法 JavaScript 是一种广泛使用的编程语言,适用于网页开发、服务器端编程以及移动应用开发。以下是几种常见的 JavaScript 实现方法: 网页交互功能 使用…

js实现倒计时

js实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时功能可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterv…

css文件制作详细点

css文件制作详细点

CSS 文件制作指南 CSS(层叠样式表)用于控制网页的样式和布局。以下是详细的制作方法: 创建 CSS 文件 新建一个文本文件,将其保存为 .css 扩展名,例如 styles.css。确保文件名…

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Jav…

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与…