当前位置:首页 > JavaScript

js下载实现

2026-02-01 22:40:24JavaScript

使用原生JavaScript实现文件下载

通过创建<a>标签并设置download属性实现下载。适用于已知文件URL且同源的场景:

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);
}

处理跨域或动态内容下载

当需要下载跨域资源或动态生成的内容时,可使用fetch API获取数据后转换为Blob对象:

js下载实现

async function downloadFromUrl(url, filename) {
  const response = await fetch(url);
  const blob = await response.blob();
  const blobUrl = URL.createObjectURL(blob);

  const a = document.createElement('a');
  a.href = blobUrl;
  a.download = filename || 'file';
  a.click();

  URL.revokeObjectURL(blobUrl);
}

下载文本内容

直接生成Blob对象实现文本内容下载:

js下载实现

function downloadText(content, filename) {
  const blob = new Blob([content], { type: 'text/plain' });
  const url = URL.createObjectURL(blob);

  const a = document.createElement('a');
  a.href = url;
  a.download = filename || 'text.txt';
  a.click();

  URL.revokeObjectURL(url);
}

处理大文件分块下载

对于大文件下载可添加进度监控:

async function downloadWithProgress(url, filename) {
  const response = await fetch(url);
  const reader = response.body.getReader();
  const contentLength = +response.headers.get('Content-Length');
  let receivedLength = 0;
  let chunks = [];

  while(true) {
    const { done, value } = await reader.read();
    if (done) break;

    chunks.push(value);
    receivedLength += value.length;
    console.log(`Downloaded ${receivedLength} of ${contentLength}`);
  }

  const blob = new Blob(chunks);
  const blobUrl = URL.createObjectURL(blob);

  const a = document.createElement('a');
  a.href = blobUrl;
  a.download = filename || 'file';
  a.click();

  URL.revokeObjectURL(blobUrl);
}

处理浏览器兼容性问题

针对旧版本浏览器的兼容方案:

function legacyDownload(url) {
  if (window.navigator.msSaveBlob) {
    // IE特定方法
    fetch(url).then(res => res.blob()).then(blob => {
      window.navigator.msSaveBlob(blob, 'download');
    });
  } else {
    // 标准方法
    const a = document.createElement('a');
    a.href = url;
    a.target = '_blank';
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
  }
}

安全注意事项

  • 确保下载操作由用户交互触发,避免弹出拦截
  • 处理跨域资源时需确保服务器配置CORS头部
  • 大文件下载建议提供取消功能
  • 移动端需考虑触摸事件兼容性

标签: js
分享给朋友:

相关文章

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js 实现倒计时

js 实现倒计时

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

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 /…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…