当前位置:首页 > JavaScript

js下载功能实现

2026-04-03 23:51:12JavaScript

使用<a>标签下载

通过创建带有download属性的<a>标签实现文件下载,适用于已知文件URL或Blob数据:

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

通过Blob对象下载

处理动态生成的内容时,可将其转换为Blob后下载:

js下载功能实现

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

使用Fetch API下载

从远程服务器获取文件时,通过Fetch API处理跨域和认证问题:

js下载功能实现

const fetchAndDownload = async (url, filename) => {
  const response = await fetch(url);
  const blob = await response.blob();
  const objectUrl = URL.createObjectURL(blob);
  downloadFile(objectUrl, filename);
  setTimeout(() => URL.revokeObjectURL(objectUrl), 100);
};

大文件分块下载

处理大文件时可使用流式下载避免内存溢出:

const downloadLargeFile = async (url, filename) => {
  const response = await fetch(url);
  const reader = response.body.getReader();
  const chunks = [];

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

  const blob = new Blob(chunks);
  downloadFile(URL.createObjectURL(blob), filename);
};

进度显示实现

添加下载进度监控功能:

const downloadWithProgress = (url, filename) => {
  return new Promise((resolve) => {
    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(`下载进度: ${percent}%`);
      }
    };

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

    xhr.send();
  });
};

注意事项

  • 跨域请求需服务器配置CORS头部
  • iOS Safari对程序触发的下载有限制
  • 部分浏览器可能阻止多文件自动下载
  • 大文件下载建议添加超时和错误处理

标签: 功能js
分享给朋友:

相关文章

前端实现拖拽功能vue

前端实现拖拽功能vue

使用 HTML5 拖放 API 在 Vue 中可以通过 HTML5 的原生拖放 API 实现拖拽功能。需要监听 dragstart、dragover 和 drop 事件。 <template&…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

vue实现tab功能

vue实现tab功能

Vue实现Tab功能的方法 使用动态组件和v-for指令 在Vue中实现Tab功能可以通过动态组件和v-for指令结合完成。定义一个包含tab标题和对应内容的数组,使用v-for渲染tab标题,并通过…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…