当前位置:首页 > 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对象:

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对象实现文本内容下载:

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实现轮播图

js实现轮播图

轮播图实现方法 基础HTML结构 <div class="slider"> <div class="slides"> <img src="image1.jpg…

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEv…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Ja…