当前位置:首页 > JavaScript

js 实现下载文件

2026-03-01 07:37:40JavaScript

使用 Blob 和 URL.createObjectURL

通过创建 Blob 对象生成文件内容,结合 URL.createObjectURL 生成临时链接,触发下载:

function downloadFile(content, fileName, mimeType) {
  const blob = new Blob([content], { type: mimeType });
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = fileName;
  document.body.appendChild(a);
  a.click();
  setTimeout(() => {
    document.body.removeChild(a);
    URL.revokeObjectURL(url);
  }, 100);
}

// 示例:下载文本文件
downloadFile('Hello World', 'example.txt', 'text/plain');

使用 fetch 下载远程文件

通过 fetch API 获取远程文件资源后转换为 Blob 下载:

async function downloadRemoteFile(url, fileName) {
  const response = await fetch(url);
  const blob = await response.blob();
  const objectUrl = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = objectUrl;
  a.download = fileName || new URL(url).pathname.split('/').pop();
  document.body.appendChild(a);
  a.click();
  setTimeout(() => {
    URL.revokeObjectURL(objectUrl);
    document.body.removeChild(a);
  }, 100);
}

// 示例:下载远程图片
downloadRemoteFile('https://example.com/image.png', 'downloaded.png');

直接使用 Base64 数据

适用于已知 Base64 编码数据的场景:

function downloadBase64(base64Data, fileName, mimeType) {
  const byteCharacters = atob(base64Data);
  const byteNumbers = new Array(byteCharacters.length);
  for (let i = 0; i < byteCharacters.length; i++) {
    byteNumbers[i] = byteCharacters.charCodeAt(i);
  }
  const byteArray = new Uint8Array(byteNumbers);
  const blob = new Blob([byteArray], { type: mimeType });
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = fileName;
  a.click();
  setTimeout(() => {
    URL.revokeObjectURL(url);
  }, 100);
}

兼容 IE 的替代方案

针对旧版 IE 浏览器使用 navigator.msSaveBlob

js 实现下载文件

function ieDownload(content, fileName, mimeType) {
  if (window.navigator.msSaveBlob) {
    // IE 10+
    navigator.msSaveBlob(new Blob([content], { type: mimeType }), fileName);
  } else {
    const blob = new Blob([content], { type: mimeType });
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = fileName;
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
    URL.revokeObjectURL(url);
  }
}

注意事项

  • 跨域限制:远程文件下载需服务器配置 CORS 头
  • 内存管理:及时调用 URL.revokeObjectURL 释放内存
  • 文件大小:Blob 方式适合中小文件,大文件建议服务端直接返回下载响应
  • 移动端兼容性:部分移动浏览器可能限制程序化下载行为

标签: 文件js
分享给朋友:

相关文章

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

vue文件底层实现

vue文件底层实现

Vue 文件的底层实现 Vue 单文件组件(SFC,即 .vue 文件)的底层实现依赖于 Vue 的编译工具链,主要包括 @vue/compiler-sfc 和构建工具(如 Vite 或 Webpac…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <htm…