当前位置:首页 > 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实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

js实现跳转

js实现跳转

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

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableElem…

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Promis…

css文件怎么制作

css文件怎么制作

创建CSS文件的基本步骤 CSS文件用于定义网页的样式,可以与HTML文件分离,便于管理和维护。以下是创建CSS文件的方法: 新建文本文件 使用任意文本编辑器(如Notepad++、VS Code…

旋转相册制作css文件

旋转相册制作css文件

旋转相册制作CSS文件 旋转相册通常通过CSS动画和3D变换实现,以下是一个完整的CSS文件示例,用于创建一个3D旋转相册效果。 基础HTML结构 在CSS文件之前,需确保HTML结构包含相…