front-endhtml
前段时间项目中有个需求,将数据导出为csv。最近闲下来,整理下相关知识点。git
一个 Blob对象表示一个不可变的, 原始数据的相似文件对象。Blob表示的数据不必定是一个JavaScript原生格式。 File 接口基于Blob,继承 blob功能并将其扩展为支持用户系统上的文件。github
通俗来讲, Blob 是一个js对象类型,存着二进制数据。json
直接经过构造函数进行建立。浏览器
Blob(blobParts[, options])
options是一个对象,能够包含下面两个属性:app
type -- MIME类型, 类型未知返回空字符串函数
endings -- 决定 append() 的数据格式(数据中的 n 如何被转换),能够取值为"transparent"(不变, 默认)或者"native"(按操做系统转换);this
let debug = {debug: 'this is a test'}; let blob = new Blob(JSON.stringify(debug, null, 2));
var blob = instanceOfBlob.slice([start [, end [, contentType]]]};
返回一个新的 Blob 对象,包含了源 Blob 对象中指定范围内的数据。编码
/** * 使用 Blob 下载文本,字符串,json * * @param {String} content 已转string的文本、json等 * @param {String} filename 下载时文件取名为? **/ const funcDownload = (content, filename, type = 'text/plain') => { let downLink = document.createElement('a'); // 支持a连接下载? if (!('download' in downLink)) return false; downLink.download = filename; downLink.style.display = 'none'; // 字符串内容转blob地址 let blobURL = new Blob([content], {type}); downLink.href = URL.createObjectURL(blobURL); // 触发下载 document.body.appendChild(downLink); downLink.click(); // 移除 a 节点 document.body.removeChild(downLink); };
假设需求是这样的,二进制数据的第一位是一个标识符,指代该图的分类,以后是image的二进制数据。spa
ws.onmessage = (event) => { if(event.data.instanceof Blob) { let blob = event.data; // 拆分 blob const blobImgFlag = blob.slice(0, 1); const blobImg = blob.slice(1); // 将 blob 的 img flag 转成字符串 let reader = new FileReader(); reader.readAsBinaryString(blobImgFlag); // 读取成功 callback reader.onload = function (evt) { if(evt.target.readyState === FileReader.DONE) { const imgFlag = evt.target.result; // ... 根据获得的 imgFlag 作点啥, 如 let img = document.getElementById(`img-${imgFlag}`); // 显示在页面中 img.src = URL.createObjectURL(blogImg); } } } }
这里其实用的就是第一个实例的方法,不过若是涉及到中文,须要指定下编码跟加上BOM头防乱码。
// 你须要把数据拼接为字符串,单元格与单元格用逗号(,)分隔, 行与行用换行符(\r\n)分隔。 如: let content = '时间,正常(0<=评分<70),疑似(70<=评分<90),欺诈(90<=评分<=100),\r\n2017/09/07 00:00,0,0,0,\r\n2017/09/07 01:00,0,0,0,\r\n2017/09/07 02:00,0,0,0,\r\n2017/09/07 03:00,0,0,0,\r\n2017/09/07 04:00,0,0,0,\r\n2017/09/07 05:00,0,0,0,\r\n2017/09/07 06:00,0,0,0,\r\n2017/09/07 07:00,0,0,0,\r\n2017/09/07 08:00,0,0,0,\r\n2017/09/07 09:00,0,0,0,\r\n'; const fileName = 'balabala.csv'; // 若是有问题,试试 'text/csv;chartset=utf-8' const type = 'text/plain;chartset=utf-8'; funcDownload(content, fileName, type);