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

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
分享给朋友:

相关文章

php实现文件下载

php实现文件下载

PHP 实现文件下载的方法 使用 header() 函数强制下载 设置正确的 HTTP 头信息,强制浏览器下载文件而不是直接打开。 $file = 'path/to/file.pdf'; if (f…

vue实现文件下载

vue实现文件下载

使用 Blob 对象和 URL.createObjectURL 通过创建 Blob 对象生成文件内容,利用 URL.createObjectURL 生成临时链接,再通过动态创建 <a> 标…

vue实现文件的上传

vue实现文件的上传

文件上传的基本实现 在Vue中实现文件上传通常结合HTML的<input type="file">元素和FormData对象。通过监听文件选择事件获取文件对象,再通过AJAX或axios发…

vue实现静态文件下载

vue实现静态文件下载

实现静态文件下载的方法 在Vue项目中实现静态文件下载可以通过多种方式完成,以下是几种常见的方法: 使用<a>标签下载 将静态文件放置在项目的public目录下,通过<a&g…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取 j…