当前位置:首页 > 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 对象生成下载链接,适合动态生成内容的场景:

js实现点击下载功能

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:

js实现点击下载功能

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

分享给朋友:

相关文章

vue实现功能插件

vue实现功能插件

Vue 插件实现方法 Vue 插件通常用于封装全局功能(如指令、过滤器、混入等),以下是实现 Vue 插件的典型方式: 插件基本结构 const MyPlugin = { install(Vu…

vue怎么实现功能

vue怎么实现功能

Vue 是一个渐进式 JavaScript 框架,常用于构建用户界面。以下是一些常见的功能实现方法: 数据绑定 Vue 通过 v-model 实现双向数据绑定,适用于表单输入等场景: <te…

h5能实现抽题功能吗

h5能实现抽题功能吗

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

vue订阅功能实现

vue订阅功能实现

Vue 订阅功能实现 Vue 中实现订阅功能通常涉及事件总线(Event Bus)、Vuex 状态管理或第三方库(如 mitt)。以下是几种常见方法: 使用事件总线(Event Bus) 创建一个全…

vue实现文件功能

vue实现文件功能

Vue 实现文件上传功能 使用 Vue 实现文件上传功能可以通过原生 HTML 的 <input type="file"> 结合 Vue 的事件处理和 HTTP 请求库(如 Axios)来…

vue打印功能实现

vue打印功能实现

使用Vue实现打印功能 Vue中实现打印功能可以通过浏览器原生的window.print()方法或借助第三方库如vue-print-nb来实现。以下是两种常见方法: 方法一:使用原生JavaScri…