当前位置:首页 > JavaScript

js实现页面下载

2026-04-07 12:05:16JavaScript

使用<a>标签下载文件

通过创建带有download属性的<a>标签实现文件下载。适用于已知文件URL的情况:

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

使用Blob对象下载动态内容

将文本或数据转换为Blob对象实现下载,适用于需要动态生成文件内容的场景:

const downloadText = (content, filename, mimeType = 'text/plain') => {
  const blob = new Blob([content], { type: mimeType });
  const url = URL.createObjectURL(blob);
  const link = document.createElement('a');
  link.href = url;
  link.download = filename || 'file.txt';
  document.body.appendChild(link);
  link.click();
  setTimeout(() => {
    document.body.removeChild(link);
    URL.revokeObjectURL(url);
  }, 0);
};

下载Canvas内容

将Canvas元素内容导出为图片文件:

const downloadCanvas = (canvas, filename = 'image.png') => {
  const link = document.createElement('a');
  link.download = filename;
  link.href = canvas.toDataURL('image/png');
  link.click();
};

处理大文件分块下载

使用Streams API处理大文件下载,避免内存问题:

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

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

  const blob = new Blob(chunks);
  const downloadUrl = URL.createObjectURL(blob);
  const link = document.createElement('a');
  link.href = downloadUrl;
  link.download = filename;
  link.click();
}

添加下载进度显示

为文件下载添加进度提示:

js实现页面下载

function downloadWithProgress(url, filename) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'blob';

    xhr.onprogress = (event) => {
      if (event.lengthComputable) {
        const percent = Math.round((event.loaded / event.total) * 100);
        console.log(`下载进度: ${percent}%`);
      }
    };

    xhr.onload = () => {
      if (xhr.status === 200) {
        const blob = xhr.response;
        const downloadUrl = URL.createObjectURL(blob);
        const link = document.createElement('a');
        link.href = downloadUrl;
        link.download = filename;
        link.click();
        resolve();
      }
    };

    xhr.onerror = () => reject(new Error('下载失败'));
    xhr.send();
  });
}

注意事项

  • 跨域资源需要服务器配置CORS头部才能下载
  • 某些浏览器可能限制自动下载行为,需要用户交互触发
  • 移动端浏览器对下载的支持可能有所不同
  • 大文件下载建议使用分块或流式处理避免内存问题

标签: 页面js
分享给朋友:

相关文章

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

vue如何实现默认页面

vue如何实现默认页面

Vue 实现默认页面的方法 在 Vue 项目中,通常需要设置一个默认页面(如首页或登录页)作为用户访问时的初始页面。可以通过路由配置实现。 配置路由默认跳转 在 Vue Router 中,使用 re…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js实现验证

js实现验证

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

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

实现vue页面回退

实现vue页面回退

使用 Vue Router 的编程式导航 在 Vue 组件中调用 this.$router.go(-1) 可以实现页面回退。该方法通过操作浏览器历史记录栈实现后退功能,类似于点击浏览器的后退按钮。…