当前位置:首页 > 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 和已接收字节数计算进度。

js实现文件下载

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实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现路由

js实现路由

js实现路由的方法 在JavaScript中实现路由功能可以通过多种方式完成,以下是几种常见的方法: 使用原生JavaScript实现路由 通过监听window.onhashchange事件来实现基…

js实现下拉刷新

js实现下拉刷新

监听触摸事件 通过监听 touchstart、touchmove 和 touchend 事件来检测用户下拉手势。记录触摸起始位置和移动距离。 let startY = 0; let currentY…

js实现显示隐藏

js实现显示隐藏

显示隐藏的实现方法 在JavaScript中,实现元素的显示和隐藏可以通过多种方式完成。以下是几种常见的方法: 修改CSS的display属性 通过改变元素的display属性可以在none(隐藏)…

js实现 拖动

js实现 拖动

实现拖动的步骤 HTML 结构 创建一个可拖动的元素和一个放置区域: <div id="draggable" draggable="true">拖动我</div> <d…