当前位置:首页 > 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 响应进度实现下载进度条:

js实现点击下载功能

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() 释放内存
  • 对于敏感文件建议添加服务器端权限验证

分享给朋友:

相关文章

vue实现轨道功能

vue实现轨道功能

Vue 实现轨道功能的方法 轨道功能通常指在界面中实现元素沿特定路径移动的效果,例如进度条、时间轴或动画轨迹。以下是几种常见的实现方式: 使用 CSS 动画与 Vue 结合 通过 Vue 动态绑定样…

vue实现粘贴功能

vue实现粘贴功能

实现粘贴功能的基本方法 在Vue中实现粘贴功能通常涉及监听paste事件,并处理剪贴板数据。以下是一个基础实现示例: <template> <div @paste="handl…

vue实现换页功能

vue实现换页功能

Vue 实现分页功能 使用第三方库(如 Element UI) 安装 Element UI: npm install element-ui 在 main.js 中引入: import Vue fr…

php购物车功能的实现

php购物车功能的实现

实现购物车功能的基本方法 使用PHP实现购物车功能可以通过会话(Session)或数据库存储购物车数据。以下是两种常见方法的详细说明。 使用Session存储购物车数据 PHP的$_SESSION可…

vue 实现多选功能

vue 实现多选功能

Vue 实现多选功能的方法 使用 v-model 绑定数组 在 Vue 中,可以通过 v-model 绑定一个数组来实现多选功能。适用于复选框组(checkbox)或下拉多选(select multi…

vue实现的功能

vue实现的功能

Vue.js 的核心功能 Vue.js 是一个渐进式 JavaScript 框架,专注于构建用户界面。其核心功能包括数据绑定、组件化开发、指令系统和状态管理,适用于从简单交互到复杂单页应用(SPA)的…