当前位置:首页 > JavaScript

js实现点击下载功能

2026-01-31 01:13:32JavaScript

使用 <a> 标签实现下载

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

function downloadFile(url, filename) {
  const a = document.createElement('a');
  a.href = url;
  a.download = filename || 'downloaded-file';
  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);
}

处理跨域资源下载

当下载跨域资源时,需要先通过 fetch API 获取数据再转换为 Blob:

async function downloadCrossOriginFile(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);
}

大文件分块下载

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

async function downloadLargeFile(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);
  const objectUrl = URL.createObjectURL(blob);
  downloadFile(objectUrl, filename);
  URL.revokeObjectURL(objectUrl);
}

添加下载进度显示

通过监听 fetch 响应进度实现下载进度条:

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

  while(true) {
    const { done, value } = await reader.read();
    if(done) break;
    chunks.push(value);
    receivedLength += value.length;
    console.log(`Downloaded ${(receivedLength/contentLength*100).toFixed(1)}%`);
  }

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

注意事项

  • 移动端浏览器可能对程序化下载有不同限制
  • download 属性在某些跨域场景下可能失效
  • 及时调用 URL.revokeObjectURL() 释放内存
  • 对于敏感文件建议添加服务器端权限验证

js实现点击下载功能

分享给朋友:

相关文章

vue实现桌面功能

vue实现桌面功能

Vue 实现桌面功能的方法 Vue.js 可以通过结合 Electron 或 NW.js 等框架实现桌面应用开发。以下是几种常见的方法: 使用 Vue 与 Electron 结合 Electron…

前端vue登录功能实现

前端vue登录功能实现

登录功能实现步骤 在Vue中实现登录功能通常需要结合后端API,以下是关键步骤和代码示例: 创建登录表单组件 <template> <div> <form…

vue实现论坛功能

vue实现论坛功能

实现论坛功能的核心模块 论坛功能通常包含用户发帖、回帖、分类浏览、搜索等核心模块。Vue.js 作为前端框架,需配合后端 API 实现数据交互。 基础项目结构搭建 使用 Vue CLI 或 Vit…

h5能实现抽题功能吗

h5能实现抽题功能吗

H5实现抽题功能的技术方案 H5完全能够实现抽题功能,主要通过前端技术结合后端数据交互完成。以下是具体实现方式: 前端技术实现 HTML5结合JavaScript可以动态生成和展示题目,利用DOM操…

vue实现表情功能

vue实现表情功能

实现表情功能的基本思路 在Vue中实现表情功能通常涉及表情选择器的UI组件开发、表情数据的存储与渲染,以及用户输入与表情的交互逻辑。以下是具体实现方法: 表情数据准备 准备一个表情符号的数组或对…

vue实现筛选功能

vue实现筛选功能

实现筛选功能的基本思路 在Vue中实现筛选功能通常涉及数据绑定、计算属性和方法的使用。通过监听用户输入或选择,动态过滤数据列表。 基础筛选实现 创建一个输入框绑定到Vue实例的data属性,使用计算…