问题所在:这个问题来源于一个需求:vue前端给用户提供yaml文件下载(在后端没有提供给前端yaml文件的前提下)
解决思路:在往常我写过的文件上传下载的相关功能里面,都是后端提供给前端文件,前端只需要建立一个下载链接,将文件流下载到本地;但是这次后端没有提供给前端文件,前端需要根据后端提供的数据对象,提取所需信息,形成yaml文件,再提供给用户下载。刚开始没有什么思路,后来查资料的过程中偶然知道了一个插件json2yaml
npm官方文档上面介绍json2yaml:用于将JSON转换为YAML
(官方文档连接https://www.npmjs.com/package/json2yaml)
这个需求的难点就在于,自己很难实现yaml的格式约束,这个插件恰好解决了这个问题,所以思路就是,用json2yaml
将后端提供的对象(后端提供的对象数据默认是json对象)转换成yaml对象(这也就解决了难点),然后再保存为yaml文件
解决过程:
- 安装依赖
npm install -save json2yaml
- 在vue文件中json2yaml
var json2yaml = require('json2yaml')
- 处理从后端得到的数据,转换成yaml对象,并生成下载的数据流
this.$axios
.get(url)
.then(response => {
this.yamlStr = json2yaml.stringify(response.data.data)//在这里调用json2yaml
//生成下载文件流
let export_blob = new Blob([this.yamlStr])
let save_link = document.createElement('a')
save_link.href = window.URL.createObjectURL(export_blob)
save_link.download = response.data.data.name + '.yml'
this.fakeClick(save_link)
})
- 为保存文件添加一个鼠标事件,实现下载文件效果
fakeClick(obj) {
let ev = document.createEvent('MouseEvents')
ev.initMouseEvent(
'click',
true,
false,
window,
0,
0,
0,
0,
0,
false,
false,
false,
false,
0,
null
)
obj.dispatchEvent(ev)
},
这样就解决了,借鉴了一个大佬的,他还实现了从yaml转json,再转yaml,生成yaml文件,感兴趣可以看一下。
指路大佬→(https://blog.csdn.net/seasidexin/article/details/109101119)
补记:2021.2.4遇到一个坑
因为需求问题,在原本的基础上还需要增加对yml文件的解析,也就是上面那个大佬的一套流程,但是测试小姐姐在测试的时候发现了一个bug:yml文件中的浮点数,js-yaml
的load
方法会解析成整数,但只针对于末尾是0
的,类似于1.0
,2.10
这种类型的浮点数。
具体错误:
1.0
解析成:1
1.
解析成:1
emmm,反正就有点无语,查了挺多资料也没解决掉,先放在这里吧,等之后改掉了,再来填坑。
如果哪个大佬路过,要是有什么见解,希望在评论区指点一下,好人一生平安!!!!
网友评论