file-saver 使用笔记

file-saver 是一个用于浏览器端下载文件的 JavaScript 库,常用于生成并下载文件,如导出 Excel 文件、PDF 文件等。该库简化了文件下载的过程,无需服务器端支持,适用于生成动态内容并下载。

1. 安装

首先,使用 npmyarn 安装 file-saver

npm install file-saver

yarn add file-saver

2. 基本用法

2.1 导出文本文件

import { saveAs } from 'file-saver';
 
const text = 'Hello, World!';
const blob = new Blob([text], { type: 'text/plain;charset=utf-8' });
 
saveAs(blob, 'hello.txt');

这段代码创建了一个包含文本内容的 Blob 对象,并使用 saveAs 方法将文件保存为 hello.txt

2.2 导出 JSON 文件

import { saveAs } from 'file-saver';
 
const json = { name: 'John', age: 30 };
const blob = new Blob([JSON.stringify(json, null, 2)], { type: 'application/json;charset=utf-8' });
 
saveAs(blob, 'data.json');

这个例子演示了如何导出 JSON 数据为文件。通过 JSON.stringify 方法将 JavaScript 对象转换为 JSON 字符串。

2.3 导出图片文件

import { saveAs } from 'file-saver';
 
const imageUrl = 'https://example.com/image.png';
fetch(imageUrl)
  .then(response => response.blob())
  .then(blob => {
    saveAs(blob, 'image.png');
  })
  .catch(error => console.error('Error downloading image:', error));

上面的代码演示了如何下载并保存一个远程图片文件。通过 fetch 请求获取图片内容,并将其转换为 Blob 对象,然后使用 saveAs 保存。

2.4 导出 Excel 文件(与 ExcelJS 一起使用)

结合 ExcelJS,您可以生成并导出 Excel 文件:

import { saveAs } from 'file-saver';
import * as ExcelJS from 'exceljs';
 
const workbook = new ExcelJS.Workbook();
const worksheet = workbook.addWorksheet('Sheet 1');
worksheet.addRow(['Name', 'Age']);
worksheet.addRow(['John', 30]);
worksheet.addRow(['Jane', 28]);
 
workbook.xlsx.writeBuffer().then(buffer => {
  const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
  saveAs(blob, 'data.xlsx');
});

这段代码演示了如何使用 ExcelJS 创建一个简单的 Excel 文件,并通过 file-saver 导出为 .xlsx 文件。

3. 配置选项

saveAs 方法可以接受两个参数:

  • Blob:文件数据,通常是通过 new Blob() 创建的。
  • filename:保存文件的名称。
saveAs(blob, 'filename.ext');

3.1 类型配置

可以通过 Blob 构造函数指定文件类型(MIME 类型),这有助于浏览器正确处理文件:

  • text/plain:普通文本文件。
  • application/json:JSON 文件。
  • application/vnd.openxmlformats-officedocument.spreadsheetml.sheet:Excel 文件。
  • application/pdf:PDF 文件。
  • image/png:PNG 图片。

例如:

const blob = new Blob([data], { type: 'application/pdf' });
saveAs(blob, 'document.pdf');

3.2 自动下载与取消下载

在某些情况下,您可能需要处理文件保存操作的取消或中止。file-saver 支持在文件保存时中止操作(例如,下载中止)。

const blob = new Blob([data], { type: 'application/octet-stream' });
const fileSaver = saveAs(blob, 'file.dat');
 
// 在必要时可以通过取消操作
fileSaver.abort();

3.3 文件路径与自定义名称

文件名可以在调用 saveAs 时动态指定,这为文件导出提供了更大的灵活性。您可以根据需求调整文件名,或者根据用户输入来命名文件。

const fileName = `report_${new Date().toISOString()}.csv`;
saveAs(blob, fileName);

4. 兼容性

file-saver 支持现代浏览器,尤其是在 ChromeFirefoxEdge 中表现良好。对于 IE11 和早期版本的浏览器,它使用 Blob.js 作为兼容性填充。

如果需要支持旧版本的浏览器,可以引入 FileSaver.js 的 polyfill。

5. 总结

file-saver 是一个轻量级的 JavaScript 库,简化了浏览器端的文件保存操作。结合不同的 Blob 类型,您可以导出文本、JSON、图片、Excel 文件等,并灵活控制文件名和文件类型。它的 API 简单且易用,非常适合前端开发中生成动态文件并提供下载的场景。

6. 完整示例

import { saveAs } from 'file-saver';
 
// 创建一个文本文件并导出
const text = 'Hello, file-saver!';
const textBlob = new Blob([text], { type: 'text/plain;charset=utf-8' });
saveAs(textBlob, 'hello.txt');
 
// 创建一个 JSON 文件并导出
const jsonData = { name: 'Alice', age: 25 };
const jsonBlob = new Blob([JSON.stringify(jsonData, null, 2)], { type: 'application/json;charset=utf-8' });
saveAs(jsonBlob, 'user.json');
 
// 导出 Excel 文件
import * as ExcelJS from 'exceljs';
 
const workbook = new ExcelJS.Workbook();
const worksheet = workbook.addWorksheet('Sheet 1');
worksheet.addRow(['Name', 'Age']);
worksheet.addRow(['John', 30]);
worksheet.addRow(['Jane', 28]);
 
workbook.xlsx.writeBuffer().then(buffer => {
  const excelBlob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
  saveAs(excelBlob, 'data.xlsx');
});

通过这些方法,您可以轻松地在前端生成并下载各种类型的文件,提升用户体验并增强应用的功能性。