
HTML5对象:Blob、File、FileReader、ArrayBuffer、FormData
全称是binary large object,二进制大文件对象,非Javascript特有,计算机通用对象,MDN上解释是,一个Blob对象就是一个包含有只读原始数据的类文件对象,通俗讲就是不可修改的二进制文件。
通过构造函数创建Blob对象var blob = new Blob(dataArr:Array属性, opt:{type:string}); // 创建一个装填DOMString对象的Blob对象 var dom = 'hello' var blobObj = new Blob([dom], {type: 'text/xml'}) // 创建一个装填ArrayBuffer对象的Blob对象 var kite = new ArrayBuffer(8) var blobOjb = new Blob([kite], {type: 'text/plain'})
Blob.slice() 此方法返回一个新的Blob对象,包含了原Blob对象中指定范围内的数据,利用此方法可以实现大文件的分片上传
Blob.slice(start, end ,contentType) //start:分割起始点 //end: 分割终点 //contentType:新的MIME类型
ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区,是内存上一段二进制数据,我们可以借助工具类型数组对象、DataView对它进行读写。
Blob与ArrayBuffer的关系// 下面的例子创建了一个 8 字节的缓冲区,并使用一个 Int32Array 来引用它: var buffer = new ArrayBuffer(8); var view = new Int32Array(buffer);File 概念解释
File就是文件,继承自Blob,也是二进制对象,File是Blob的子类,比blob主要多出一个name的属性。 也有自己特有的属性和方法,通常用在选择的FileList对象,或者是使用拖拽操作产生的的DataTransfer对象。
构造函数创建File对象const file = new File(array, name,options); // array:一堆数据构成的数组 //name:文件名 //options:设置一些属性,type属性、lastModified属性
Blob对象只是二进制数据的容器,本身并不能操作二进制,FileReader对象就是专门操作二进制数据的,FileReader主要用于将文件内容读入内存,通过一系列异步接口,可以在主线程中访问本地文件。
通过fileReader可以将Blob、File读取为不同的格式
const reader = new FileReader();方法 (参数:File或Blob对象)
FormData 接口提供了一种表示表单数据的键值对 key/value 的构造方式,并且可以轻松的将数据通过XMLHttpRequest.send() 方法发送出去,本接口和此方法都相当简单直接。如果送出时的编码类型被设为 “multipart/form-data”,它会使用和表单一样的格式。
FormData的最大优点就是,比起普通的ajax, 使用FormData我们可以异步上传一个二进制文件,而这个二进制文件,就是我们上面讲的Blob对象。
const formData = new FormData()方法
let blob = new Blob([file], {type: file.type})
let files = new window.File([this.blob], file.name, {type: file.type})
function blobToDataURL(blob, callback) {
let fileReader = new FileReader();
fileReader.onload = function (e) { callback(e.target.result); }
fileReader.readAsDataURL(blob);
}
image2base64(imgUrl) {
let image = new Image()
image.src = imgUrl
return new Promise((resolve) => {
image.onload = () => {
let canvas = document.createElement('canvas')
canvas.width = image.width
canvas.height = image.height
var context = canvas.getContext('2d')
context.drawImage(image, 0, 0, image.width, image.height)
let dataUrl = canvas.toDataURL('image/png')
resolve(dataUrl)
}
})
}
function dataURLtoBlob(dataurl) {
const arr = dataurl.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], { type: mime });
}
function dataURLtoFile(dataurl, filename) {
const arr = dataurl.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], filename, { type:mime });
}
readFileRows(file) {
return new Promise((resolve, reject) => {
try {
const fileReader = new FileReader();
fileReader.readAsArrayBuffer(file);
let data = [];
fileReader.onload = ({target:{result} = {}}) => {
const wb = XLSX.read(result, { type: 'buffer' });
const firstSheet = wb.Sheets[wb.SheetNames[0]];
data = XLSX.utils.sheet_to_json(firstSheet);
resolve({ rows: data.length });
};
} catch (error) {
reject(new Error('read failed'));
this.$message.error('文件行数读取失败!');
}
});
},