前端通过文件流实现多格式文件下载指南
在Web开发中,经常需要根据后端接口返回的二进制文件流触发浏览器下载。以下是一个可复用的工具函数集合,支持导出Excel、Word、PDF、ZIP、N42、TXT、JSON等多种格式。
创建通用下载工具方法
在项目中新建一个工具文件(如downloadUtils.js),封装不同文件类型的下载逻辑:
// 通用下载方法(适用于Excel/Word/PDF/ZIP/N42)
function downLoadFile(data, fileName, mimeType) {
const blob = new Blob([data], { type: mimeType });
const url = URL.createObjectURL(blob);
const anchor = document.createElement('a');
anchor.href = url;
anchor.download = fileName;
document.body.appendChild(anchor);
anchor.click();
document.body.removeChild(anchor);
URL.revokeObjectURL(url);
}
// Excel导出
export function exportExcel(data, fileName) {
downLoadFile(data, fileName, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8');
}
// Word导出
export function exportWord(data, fileName) {
downLoadFile(data, fileName, 'application/msword');
}
// PDF导出
export function exportPdf(data, fileName) {
downLoadFile(data, fileName, 'application/pdf');
}
// ZIP导出
export function exportZip(data, fileName) {
downLoadFile(data, fileName, 'application/octet-stream');
}
// N42导出(基于XML格式)
export function exportN42(data, fileName) {
downLoadFile(data, fileName, 'application/xml');
}
1. 导出Excel文件
调用通用方法,设置正确MIME类型:
import { exportExcel } from '@/utils/downloadUtils';
async function downloadExcel() {
const params = { /* 接口参数 */ };
const response = await ExportApi.getExcelData(params);
exportExcel(response.data, '报表数据.xlsx');
}
2. 导出Word文档
import { exportWord } from '@/utils/downloadUtils';
async function downloadWord() {
const params = { /* 接口参数 */ };
const response = await ExportApi.getWordData(params);
exportWord(response.data, '文档.doc');
}
3. 导出PDF文件
import { exportPdf } from '@/utils/downloadUtils';
async function downloadPdf() {
const params = { /* 接口参数 */ };
const response = await ExportApi.getPdfData(params);
exportPdf(response.data, '报告.pdf');
}
4. 导出ZIP压缩包
import { exportZip } from '@/utils/downloadUtils';
async function downloadZip() {
const params = { /* 接口参数 */ };
const response = await ExportApi.getZipData(params);
exportZip(response.data, '打包文件.zip');
}
5. 导出N42文件(核辐射检测数据格式)
import { exportN42 } from '@/utils/downloadUtils';
async function downloadN42() {
const params = { /* 接口参数 */ };
const response = await ExportApi.getN42Data(params);
exportN42(response.data, '测量数据.n42');
}
6. 导出TXT文本文件
推荐使用file-saver库简化操作:
npm install file-saver
import { saveAs } from 'file-saver';
async function downloadTxt() {
const params = { /* 接口参数 */ };
const response = await ExportApi.getTextData(params);
const blob = new Blob([response.data], { type: 'text/plain;charset=utf-8' });
saveAs(blob, '日志文件.txt');
}
7. 导出JSON数据文件
import { saveAs } from 'file-saver';
async function downloadJson() {
const params = { /* 接口参数 */ };
const response = await ExportApi.getJsonData(params);
const jsonStr = JSON.stringify(response.data, null, 2);
const blob = new Blob([jsonStr], { type: 'application/json' });
saveAs(blob, '配置数据.json');
}
以上方法涵盖了前端常见的文件流下载场景,适用于大多数后台管理系统中的数据导出需求。注意根据实际接口响应结构调整参数传递方式。