前端文件导出/下载

本文详细介绍了两种文件下载的方法:传统方式和利用file-saver插件。传统方式通过创建Blob对象和模拟点击实现下载,而使用file-saver插件则更简便,能直接指定文件名进行下载。同时,文章还展示了如何预览图片及导出不同格式的文件,涉及文件类型包括txt、excel和图片等。

文件导出/下载代码详解

1.传统方式

下载txt base64返回

const byteCharacters = atob(res.file);
	// 先转义 
	// const byteCharacters = atob(res.file);
	// 转usf-8
	// // 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([byteCharacters], {type:"text/plain;charset=utf-8"});

    let url = URL.createObjectURL(blob)
    // 创建一个下载标签<a>
    const aLink = document.createElement('a')
    aLink.href = url
    // 2.直接使用自定义文件名,设置下载文件名称
	aLink.setAttribute('download', res.fileName)
 	document.body.appendChild(aLink)
	// 模拟点击下载
	aLink.click()
	// 移除改下载标签
	document.body.removeChild(aLink)

2.利用插件

npm install file-saver

yarn add file-saver
如使用TS开发,可安装file-saver的TypeScript类型定义
npm install @types/file-saver --save-dev

  1. 导出下载文本
import { saveAs } from 'file-saver'
const blob = new Blob(['Hello, world!'])
saveAs(blob, 'hello world.txt')
// const blob = new Blob([fileStream])		
// fileStream 是文件流,一般从后台获取
// saveAs(blob, fileName)					
// fileName 保存文件的名称,需要带后缀
  1. 预览图片
// 文件流,一般从后台获取
saveAs('https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png')
  1. 导出不同格式
// 文件格式一版灰有不同
const blob = new Blob([res], {
  type: 'application/text/plain;charset=UTF-8'
})
const blob = new Blob([res], {
  type: 'application/vnd.ms-excel;charset=UTF-8'
})
const blob = new Blob([res], {
  type: 'image/jpeg'
})

具体请查看相关的文件类型

Blob 文件流下载 type类型

前端实现文件下载导出有多种方法,以下是几种不同类型文件导出的示例: ### 导出 Excel 文件 可以使用 `xlsx-populate` 插件实现按所需的列导出 Excel 文件,对于数据结构数组中包含数组的情况也能处理,同时可以设置导出的 Excel 文件带边框、首列合并、表格嵌套表格等,还能分别生成不同的工作表。以下是一个简单的思路示例,由于没有完整代码,仅作示意: ```javascript // 这里需要安装 xlsx-populate 并进行相关配置 // 假设已经完成相关配置和数据准备 // dataSource 是数据数组,columns 是所需列的配置 import XlsxPopulate from 'xlsx-populate'; async function exportExcel(dataSource, columns) { const workbook = await XlsxPopulate.fromBlankAsync(); // 创建工作表 const sheet = workbook.sheet('Sheet1'); // 处理表头 columns.forEach((column, index) => { sheet.cell(1, index + 1).value(column.title); }); // 处理数据 dataSource.forEach((row, rowIndex) => { columns.forEach((column, colIndex) => { sheet.cell(rowIndex + 2, colIndex + 1).value(row[column.key]); }); }); // 设置边框等样式 // ... // 保存并下载文件 const base64 = await workbook.outputAsync('base64'); const link = document.createElement('a'); link.href = `data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,${base64}`; link.download = 'exported_file.xlsx'; link.click(); } ``` ### 封装导出多个 Excel 文件并打包为压缩包下载 可以封装一个预定义好样式,直接能开箱即用的导出方法,使用者只需简单调用即可。示例代码如下: ```javascript function downloadExcel({ filename, sheets }) { // 这里需要实现具体的导出逻辑,包括创建 Excel 文件、设置样式、添加数据等 // 最后将多个 Excel 文件打包为压缩包并下载 // 以下是简单示意 sheets.forEach((sheet) => { // 处理每个工作表的数据 const { sheetName, columns, dataSource } = sheet; // 实现创建 Excel 文件的逻辑 // ... }); // 打包为压缩包并下载 // ... } function onExportExcel() { const columns = [/* 列配置 */]; const list = [/* 数据数组 */]; downloadExcel({ filename: 'test', sheets: [ { sheetName: 'test', columns, dataSource: list } ] }); } ``` ### 导出 PDF 文件 在 VUE2 项目中实现 PDF 导出和打印可以通过以下方式,在需要导出为 PDF 的文件中进行相关操作: ```vue <template> <div> <div id="pdfDom" class="pdf-box"> 这是打印的区域 </div> <button type="primary" @click="exportPdf">导出</button> </div> </template> <script> export default { methods: { exportPdf() { this.getPdf('打印文件'); }, getPdf(filename) { // 这里需要实现具体的导出 PDF 的逻辑,例如使用 html2pdf 等库 // ... } } }; </script> <style> .pdf-box { width: 1006px; height: 1430px; box-sizing: border-box; } </style> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值