前端分片导出文件(多种文件格式)思路简单

实现思路:


后端:
准备好两个接口     1. 获取文件信息 
                              2.分片获取文件信息 
前端:
1.点击导出按钮拿到文件调用获取文件信息接口。
2.拿到文件信息按照1M(自定义大小一般为1m)大小切割文件大小,拿到文件得开始跟结束得数据push到数组。            
3.根据数组得长度循环调用分片获取文件信息接口,使用Promise.all下载文件。
 

代码实现:

一、点击按钮

<el-button @click="downloadBtn(row)">下载导入文件</el-button>
//点击按钮

二、准备好两个接口,分片下载接口设置 ”responseType: "blob"“,该接口已经过封装只做展示作用。

//通过文件ID获取文件信息
export const getStatFileByFileId = (params) => {
	return http.get(PORT + `/XXX/statFileByFileId`, params, { });
};
//分片下载文件接口
export const getRangeDownloadByFileId = (params) => {
	return http.post(PORT + `/XXX/rangeDownloadByFileId`, params,{ responseType: "blob"});
};

三、文件类型匹配.js/.ts文件存放,使用得时候导入,文件类型可以由获取文件信息接口直接获取,本接口后端偷懒文件信息里面只有文件得大小信息,而且table列表中有文件类型字段。

/**
 * 文件下载HHTS类型
 */
export const BlobMap: Map<string, string> = new Map([
	["ppt", "application/vnd.ms-powerpoint"],
	["pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"],
	["xls", "application/vnd.ms-excel"],
	["xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],
	["doc", "application/msword"],
	["docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"],
	["rar", "application/rar"],
	["tar", "application/x-tar"],
	["tgz", "application/x-tar"],
	["zip", "application/zip"],
	["7zip", "application/zip"],
	["gz", "application/x-gzips"],
	["gzip", "application/x-gzip"],
	["rtf", "application/rtf"],
	["js", "javascript/js"],
	["css", "text/css"],
	["pdf", "application/pdf"],
	["gif", "image/gif"],
	["jpg", "image/pjpeg"],
	["jpg2", "image/jp2"],
	["png", "image/jp2"],
	["tif", "image/tiff"],
	["tiff", "image/tiff"],
	["bmp", "image/bmp"],
	["svg", "image/svg+xml"],
	["svgz", "image/svg+xml"],
	["webp", "image/svg+xml"],
	["ico", "image/x-icon"],
	["wps", "application/kswps"],
	["psd", "application/x-photoshop"],
	["swf", "application/x-photoshop"],
	["txt", "text/plain"],
	["htm", "text/html"],
	["html", "text/html"],
	["xml", "text/xml"],
	["jar", "application/java-archive"],
	["DEFAULT", "application/octet-stream"],
]);

三、主要代码实现

import { BlobMap } from "@/enums/httpBlobType";//导入文件类型Map结构
import { getRangeDownloadByFileId, getStatFileByFileId }from"@/api/modules/XXXX"; //导入接口

const downloadLogic = async (row) => {
 const { data } = await getStatFileByFileId({ fileId: row.id }); //获取文件大小接口
    const length = data["length"]; //文件大小 单位字节
    const chunk = 1024 * 1024; // 定义每个片段的大小为1M
    let size = Math.ceil(length / chunk); // 定义文件需要分成多次片    文件大小 / 定义每个片段的大小为1M = 请求次数
    // 文件分割为数组
    const chunks = [];
    let start = 0;
    let end = 0;
    for (let i = 0; i < size; i++) {
        end = start + chunk;
        if (end > length) {
            end = length;
        }
        let item = {
            fileId: row.id,//文件ID
            startIndex: start,//起始下载游标
            endIndex: end,//截止下载游标
        };
        chunks.push(getRangeDownloadByFileId({ data: item})); //分片下载文件接口
        start = end;
    }
    let type = BlobMap.get(row.userType); //根据当前选中行 文件类型 字段匹配 下载文件类型
    Promise.all(chunks)
        .then((res) => {
            let blob = new Blob(res, {
                type,
            });
            // type是文件类,详情可以参阅blob文件类型
            // 创建新的URL并指向File对象或者Blob对象的地址
            const blobURL = window.URL.createObjectURL(blob);
            // 创建a标签,用于跳转至下载链接
            const tempLink = document.createElement("a");
            tempLink.style.display = "none";
            tempLink.href = blobURL;
            let fileName = row.userName; 根据当前选中行 文件名称 字段匹配 下载文件名称
            tempLink.setAttribute("download", fileName);
            // 兼容:某些浏览器不支持HTML5的download属性
            if (typeof tempLink.download === "undefined") {
                tempLink.setAttribute("target", "_blank");
            }
            // 挂载a标签
            document.body.appendChild(tempLink);
            tempLink.click();
            document.body.removeChild(tempLink);
            // 释放blob URL地址
            window.URL.revokeObjectURL(blobURL);
            ElNotification.closeAll()
            alert('下载完成')
        })
}

注意!!

一定要跟后端说话分片请求数据起始下载游标截止下载游标的规则    

 一、[ {startIndex: 1,  endIndex: 2},{startIndex: 2,  endIndex: 3,}]

二、 [ {startIndex: 1,  endIndex: 2},{startIndex: 3,  endIndex: 4,}]

 在有概率上的压缩包下载会有问题,导致多请求数据或者少请求数据!!!

四、嘿嘿嘿点赞写Bug-1,看到给个赞呗大佬!!!

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端中,你可以使用以下方法来实现导入和导出 Excel 文件: 1. 导出 Excel 文件: - 使用 Excel.js、xlsx-populate、xlsx-writer 等库来生成 Excel 文件。 - 将数据转换为 Excel 格式并下载到客户端。在浏览器中,你可以创建一个 Blob 对象,然后使用 URL.createObjectURL(blob) 方法来生成下载链接,最后使用 a 标签的 download 属性来触发下载。 2. 导入 Excel 文件: - 使用第三方库如 exceljs、xlsx、xlsx-populate 等来读取和解析 Excel 文件。 - 通过文件输入(input file)元素让用户选择要上传的 Excel 文件,并使用 FileReader 对象读取文件内容。 - 使用解析库将读取到的数据进行处理,如解析为 JSON 或者直接处理为 JavaScript 对象。 以下是一个使用 SheetJS/xlsx 库导入导出 Excel 文件的示例: ```html <!-- 导入 Excel 文件 --> <input type="file" id="file-input" accept=".xlsx,.xls" /> <!-- 导出 Excel 按钮 --> <button id="export-btn">导出 Excel</button> <script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script> <script> // 导入 Excel 文件 document.getElementById('file-input').addEventListener('change', function(event) { var file = event.target.files[0]; var reader = new FileReader(); reader.onload = function(e) { var data = new Uint8Array(e.target.result); var workbook = XLSX.read(data, { type: 'array' }); // 处理 Excel 数据 var sheetName = workbook.SheetNames[0]; var worksheet = workbook.Sheets[sheetName]; var jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); console.log(jsonData); }; reader.readAsArrayBuffer(file); }); // 导出 Excel 文件 document.getElementById('export-btn').addEventListener('click', function() { var worksheet = XLSX.utils.json_to_sheet([ { Name: 'John Doe', Age: 30 }, { Name: 'Jane Smith', Age: 25 } ]); var workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); var excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }); var blob = new Blob([excelBuffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = 'data.xlsx'; a.click(); URL.revokeObjectURL(url); }); </script> ``` 这是一个基本的示例,你可以根据需求进行修改和扩展。记得在实际使用中引入相应的库文件,并根据实际情况进行数据处理和样式设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值