前端实现csv文件的解析预览、上传、下载

2023-10-30

最近遇到了一些关于csv文件的上传、下载、解析预览、删除的需求。因为之前没有做过,尤其是关于csv的解析并预览,于是记录一下。

上传

关于上传,绝大部分的选择都是通过第三方的OSS进行存储,比如阿里云的。
这个其实没什么难度,有文档可以看。对于前端来说,上传到OSS和上传给自己的后端,在过程上没什么区别,只是上传OSS多了一些配置项的参数。

首先下载ossnpm
npm install ali-oss --save

顶部进行引入
import OSS from 'ali-oss';

上传的核心代码:

  const uploadFile = async (files, fileLists) => {
        const fileMaxSize = 1024 * 10;
        const fileType = ['csv', 'txt'];
        const { originFile: { size, name } } = files[0];
        const nameType = name.split('.')[1];
        if (size / 1024 > fileMaxSize) {
            Message('error', '文件过大!');
            return;
        };
        if (!fileType.includes(nameType)) {
            Message('error', '只支持csv和txt格式文件!');
            return;
        }
        const ossConfig = {
            region: 'oss-cn-xxxxxxx',
            accessKeyId: 'xxxxxxx',
            accessKeySecret: 'xxxxxxxxxx',
            bucket: 'xxxxx',
        };
        const client = new OSS(ossConfig);
        const { name: res_name, url } = await client.put(
            `xxxxxx/test/${v4()}.${nameType}`,
            files[0].originFile,
        )
    };

其实需要的参数就是ossConfig这个对象,用来实例化引入的OSS

  • region,这个填写的是你买的oss资源的地区,比如oss-cn-beijing, 就是买的中国北京地区的资源
  • accessKeyIdaccessKeySecret,这两个是用来鉴权需要的密钥,我是像运维要的,估计是在阿里云后台里生成的
  • bucket,这个是你放到的根文件夹名字,一般就是你申请资源时的主体

然后实例化出来的client就可以直接用了,一般都是用put方法,直接进行覆盖。传入的第一个参数是你要放到OSS的路径,比如creator/test/xxxx.csv,我这个名字为了避免重复,是用了一个uuid的,需要的可以自己下一下,还是比较好用的,理论上不会重复的一段字符串。
npm install uuid --save
import { v4 } from 'uuid'

然后你就可以在返回值里拿到一系列的返回值了。

前端实现文件上传到OSS,总体比较简单,配置一下参数之后,就跟正常的上传二进制文件一样了。

下载

下载也相对来说简单一下,先说下载,最后说预览解析。

前端实现文件的下载,其实方法比较单一,基本都是通过动态创建a标签模拟点击来实现的。

const downloadFile = async (name, url) => {
        console.log(name, url);
        const result = await fetch(url);
        const file = await result.blob();
        let a = document.createElement('a');
        let _url = window.URL.createObjectURL(file);
        let filename = name;
        a.href = _url;
        a.download = filename;
        a.style.display = 'none';
        document.body.appendChild(a);
        a.click();
        window.URL.revokeObjectURL(_url);
        document.body.removeChild(a);
    }

因为文件是上传到了OSS,所以前端进行下载操作的前提是,先拿到这个文件的二进制流。

先通过原生的fetch方法请求存在OSS的这个文件。然后通过查看原型链,可以找到这个blob方法,将返回值转为我们需要的二进制流。

接下来的一系列操作就是通用的前端实现文件下载的代码:

  • 动态创建a标签
  • 通过window提供的createObjectURL将二进制流文件转为当前域名下的一段url
  • 然后将这个url赋值给a标签的href属性
  • 给这个要下载的文件起一个名字赋值给a标签的download属性
  • a标签隐藏,放入当前文档流中(可选)
  • 模拟click事件点击
  • 销毁url、销毁a标签

总结下来,前端实现下载文件,其实在业务场景中很常见,实现方式也比较单一,先获取到要下载的文件二进制流、通过a标签实现下载。

解析预览

首先,我们需要知道,csv文件的特性,才可以进行解析。

csv的内容其实就是形如下方的这个格式。
username, password, nickname, age,,,
creator, 123456, creator, 12,,,
xiaozhang, 123456, xiaozhang, 12,,,
所以,根据csv文件的特点,我们就可以进行解析和展示的,展示形式一般都是表格table

默认情况下,我们认为csv的第一行数据是表头,所以,我们预期是将上面这段内容转为:

[
	{
		username: 'creator',
		password: '123456',
		nickname: 'creator',
		age: '12',
	},
	{
		username: 'xiaozhang',
		password: '123456',
		nickname: 'xiaozhang',
		age: '12',
	}
]

进行数据转为的代码封装为一个函数。

const formatCSV = (str) => {
	let result = [];
	let jsonObj = str.split(/((\r\n)|[\r\n])+/gi);
	let arrHeader = [];
	for (let i in jsonObj) {
		if (typeof jsonObj[i] === 'string' && jsonObj[i].length > 0) {
		let row = `${jsonObj[i]}`;
	    if (row.trim().length > 0) {
			const kv = jsonObj[i].split(',');
			if (i === 0) {
				arrHeader = kv;
			} else {
				const obj = {};
				for (let index = 0; index < arrHeader.length; index ++) {
					const name = String(arrHeader[index]);
					if (!obj[name]) {
						try {
							if (kv[index]) {
								obj[name] = String(kv[index]);
							} else {
								obj[name] = '';
							}
						} catch (err) {
							obj[name] = '';
						}
					}
				}
				result.push(obj);
			}
		}	
	  }
	}
}
 const previewFile = async (url) => {
        const result = await fetch(url);
        console.log(result);
        const file = await result.blob();

        const reader = new FileReader();
        reader.onload = () => {
            const text = reader.result;
            const resultData = formatCSV(text);
            setPreviewData(resultData)
            setPreview(true);
        };

        reader.readAsText(file);
    };

然后我们就可以拿到我们想要的格式的数据了。
关于表格的展示,因为我用的是react + antdeisgn
所以拼接出Table组件需要的datacolumn即可。
data不需要额外处理,经过我们formatCSV返回的结果,就是我们需要的data

column

	let column = [];
	for (let i in data[0]) {
		column.push({
			title: i,
			dataIndex: i,
		})
	}

<Table columns={tableColumn} data={tableData} /> 

ok,经过这一系列操作,就完成了我们既定的需求,关于csv文件的上传、下载、解析预览。

总结

最近工作中做了一些没接触过的需求,总结后给大家分享一下。在此之前我甚至不知道什么是csv的文件,只知道类似于excel的表格。做了这个需求知道,我知道了前端上传文件到OSS、前端下载OSS的文件、csv文件的本质格式、前端解析csv文件并预览展示。 经验就是在一个个未接触过的需求中增长的。

QQ: 505417246
WX: 18331092918
公众号: Code程序人生
B站账号: LuckyRay123
个人博客: http://rayblog.ltd/
欢迎关注我的各类账号, 持续更新优质前端内容

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端实现csv文件的解析预览、上传、下载 的相关文章

随机推荐

  • NOKIA 刷机 6680

    使用NOKIA最新的PC套件6 82版可以在线刷机了 必须为6 82版 下载地址 http nds1 nokia com files support global phones software Nokia PC Suite 682 rel
  • 小兔鲜儿 - 微信登录

    目录 微信登录 登录方式 静态结构 获取登录凭证 获取手机号码 微信登录接口 生产环境 模拟手机登录 开发环境 用户信息持久化存储 涉及知识点 微信授权登录 文件上传 Store 状态管理等 微信登录 微信小程序的开放能力 允许开发者获取微
  • u盘安装CentOS(linux)的步骤(含双系统)

    为了学习新的知识 决定给自己的神舟本子装上CentOS系统 于是乎就自己在网上搜了教程 然而自己在安装的过程中还是出现了小问题 尤其是为了进入图形安装界面花了我很大的力气 经过多次尝试终于成功 每次装系统我的本子都会受到摧残 o 为了能给想
  • vs2015中cuda提示<<<>>>需要输入表达式

    在vs2015中写cuda代码进行编译时发现在调用核的时候 lt lt lt gt gt gt 总是提示有错误 编译提示输入表达式 但是编译是通过的 我的这个文件类型是cuda文件 cu 因为在vs中使用的是c 的语法提示 所以这个地方总是
  • Python数据库SQLite中的fetchone()、fetchMany()、fetchall()函数

    今天在练习python数据库的查询操作时 使用fetchone fetchMany fetchall 函数 出现了一些奇怪的现象 现在做如下记录 我想在同一个代码块中 使用fetchone 查询一条信息 使用fetchmany 3 查询3条
  • SQL Server中的登录名和用户名映射关系

    SQL Server 1 SQL Server 中 一个登录名可以映射多个数据库用户名 但是一个数据库用户名不能同时被两个数据库登录名映射 可以分别被A映射完 再被B映射 否则会干掉其中的一个 2 guest 用户是一个数据库用户名 是一个
  • oracle中的几种分区方式

    1 列表分区 1 1 分区技术实质可以把数据分摊到不同的物理位置 增加I O负载 提高检索效率 可用性 分区表可以跨越表空间 而普通表则不然 好处就是如果表的一个分区损坏 其他分区不会受到影响我们只需要修复损坏的分区即 可 1 2 创建li
  • 牛顿迭代法解非线性方程组(附C++代码)

    目录 一 公式介绍 二 应用环境 三 C 代码 实例说明 C 编译环境 C 代码 运行结果 特别注意 解决方法 一 公式介绍 牛顿迭代法基本公式 迭代出 面对非线性方程组问题 将上式变形 其中为 注 这里面的不再时代表一个值 而是代表关于变
  • SpringBoot---@DeleteMapping

    DeleteMapping 在编写代码时引用了 DeleteMapping 注解 DeleteMapping value remove courseNo public String remove PathVariable courseNo
  • linux中shell脚本命令使用详解

    文章目录 一 普通用户和超级用户 二 关于系统的操作 三 关于文件操作 3 1 ls显示文件 3 2 cd进出目录 3 3 mkdir创建目录 3 4 touch创建文件 3 5 cp复制命令 3 6 rm删除命令 3 7 cat命令 3
  • 注意力机制:CA - Coordinate Attention for Efficient Mobile Network Design(文末附代码)

    注意力机制 CA Coordinate Attention for Efficient Mobile Network Design 摘要 引言 具体而言 优势 相关工作 Mobile Network 架构 注意力机制 Coordinate
  • java 正则表达式 检测数学公式是否正确_java 正则表达式 检测数学公式是否正

    java 正则表达式 检测数学公式是否正 2021 02 05 13 33 36 简介 java中正则表达式基本用法的使用 1 Test01 java 使用正则表达式使代码变得非常简洁 2 TestMatcher01 java Matche
  • IBM近期扩充Watson认知API服务

    本文转载至 http www infoq com cn news 2016 03 watson cognitive apis 近期 IBM对Watson认知API服务进行了扩充 新增了情绪和语调分析API的测试版本 Watson的情绪分析A
  • Flutter 组件抽取:验证码输入功能(CodeInputContainer)

    简介 验证码输入框 可选需要输入的验证码个数 输入达指定个数后自动回调 效果 范例 class TestPageState extends State
  • 【通信原理】七、数字带通传输系统

    文章目录 一 2ASK振幅键控 2ASK振幅键控原理 2ASK包络检波 2ASK相干解调法 二 2FSK频移键控 过零点检测解调法 三 2PSK相移键控 四 2DPSK差分相移键控 差分相干解调 相位比较法 五 已调信号功率谱密度 六 抗噪
  • VB.Net正则表达式大全(3)

    深入浅出之正则表达式 注 JanGoyvaerts为RegexBuddy写的教程的译文 前言 半年前我对正则表达式产生了兴趣 在网上查找过不少资料 看过不少的教程 最后在使用一个正则表达式工具RegexBuddy时发现他的教程写的非常好 可
  • IDEA插件之输入法自动切换【Smart Input Source】

    MAC系统推荐快捷键 针对输入切换无需快捷键 但是在某些场景下比如Git Diff的时候可能存在自动跳转到源文件的情况 这种时候需要手动关闭自动切换功能 给作者提了个建议对这种场景进行优化 建议使用的快捷键 C代表关闭 O代表打开 介绍 解
  • 量子云计算:实现自我验证!

    量子云计算 实现自我验证 背景 即使对于世界上最强大的经典计算机来说 有些极度复杂的计算仍然需要花费漫长的时间 可是 从理论上说 量子计算机却可以完全胜任非常复杂的计算任务 原因是 不同于经典计算机的比特位 量子计算机拥有 量子位 经典二进
  • 人工智能讲师专家老师叶梓人工智能讲师之机器学习与深度学习-34

    接上一篇 系列博文 人工智能讲师叶梓关于人机器学习与深度学习入门课程课件 为系列博文 更多课程 及老师资料可点击 个人主页 最小二乘法的示意图 R语言实现的一元线性回归 一元回归的PYTHON实现 IMPORT PANDAS AS PD f
  • 前端实现csv文件的解析预览、上传、下载

    最近遇到了一些关于csv文件的上传 下载 解析预览 删除的需求 因为之前没有做过 尤其是关于csv的解析并预览 于是记录一下 上传 关于上传 绝大部分的选择都是通过第三方的OSS进行存储 比如阿里云的 这个其实没什么难度 有文档可以看 对于