本文深入介绍HTML5里的几种对象:Blob、File、FileReader、ArrayBuffer、ArrayBufferView、DataURL、URL
一. Blob
一个Blob对象就是一个包含有只读原始数据的类文件对象。Blob对象中的数据并不一定得是JavaScript中的原生形式。File接口基于Blob,继承了Blob的功能,并且扩展支持了用户计算机上的本地文件。
Blob对象可以看做是存放二进制数据的容器,但要读取里面的二进制数据,需要用FileReader
;此外还可以通过Blob设置二进制数据的MIME类型。
/**
* Blob构造函数:
* dataArray:数组,包含了要添加到Blob对象中的数据,数据可以是Int32Array、Uint8Array、Float32Array等,或者连续内存缓冲区ArrayBuffer,ArrayBufferView, Blob,或者 DOMString对象。
* opt:对象,用于设置Blob对象的属性(如:MIME类型)
**/
var blob = new Blob(dataArr:Array, opt:{type:string});
var s = 'hello'
var blobObj = new Blob([s], {type: 'text/xml'})
var abf = new ArrayBuffer(8)
var blobOjb = new Blob([abf], {type: 'text/plain'})
/**
* start:开始索引,默认为0
* end:截取结束索引(不包括end)
* contentType:新Blob的MIME类型,默认为空字符串
**/
Blob.slice(start:number, end:number, contentType:string)
function createDownload(fileName, content){
var blob = new Blob([content]);
var link = document.createElement("a");
link.download = fileName;
link.href = URL.createObjectURL(blob); //可以直接当作image的src属性来显示图片
link.click()
}
二. File
File是Blob的子类,比blob主要多出一个name的属性。
我们常用的文件选择标签
var input = document.querySelector('input[type=file]');
console.log(input.files) // FileList {0: File(3044232), length: 1}
除了可以使用base64字符串作为内容的DataURI将一个文件嵌入到另外一个文档里,还可以使用URL对象。URL对象用于生成指向File对象或Blob对象的URL
静态方法:
var objectURL = URL.createObjectURL(blob);
blob
是用来创建 URL 的 File 对象或者 Blob 对象
window.URL.revokeObjectURL(objectURL);
objectURL
是一个 DOMString,表示通过调用 URL.createObjectURL() 方法产生的 URL 对象
我们知道Blob对象只是二进制数据的容器,本身并不能操作二进制,FileReader对象就是专门操作二进制数据的,FileReader主要用于将文件内容读入内存,通过一系列
异步
接口,可以在主线程中访问本地文件。
创建实例:
var reader = new FileReader();
方法(入参都是File
或Blob
对象)
事件名称
它们在实际场景中的一些应用
var input = document.getElementById("file"); //input file
input.onchange = function(){
var file = this.files[0];
if(!!file){
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function(){
//读取完毕后输出结果
document.getElementById("file_img").src = reader.result //显示上传的图片
console.log(reader.result);
}
}
}
在实际文件上传中,将用户选择的图片读取为ArrayBuffer并保存到新的Blob对象中,二进制的方式传参比直接传图片效率更高)
input.addEventListener('change', function() {
var file = this.files[0],
fr = new FileReader(),
blob;
fr.onload = function() {
blob = new Blob([this.result]);
var formdata = new FormData()
formdata.append('file', blob)
};
fr.readAsArrayBuffer(file)
});
function getImgToBase64(url,callback){
var canvas = document.createElement('canvas')
var ctx = canvas.getContext('2d')
var img = new Image
img.crossOrigin = 'Anonymous';
img.onload = function(){
canvas.height = img.height;
canvas.width = img.width;
ctx.drawImage(img,0,0);
var dataURL = canvas.toDataURL('image/png'); //base64格式
callback(dataURL);
canvas = null;
};
img.src = url;
}
Blob
、File
function base64ToBlob(base64){
var arr = base64.split(',')
var mime = arr[0].match(/:(.*?);/)[1]
var bytes = atob(arr[1]) //对用base64编码过的二进制进行解码
var n = bytes.length
var u8arr = new Uint8Array(n)
while(n--){
u8arr[n]=bytes.charCodeAt(n); //将编码转换成Unicode编码
}
return new Blob([u8arr], {type: mime})
//or: return new File(u8arr], {type:mime}) //base64转换为文件
//以二进制的方式传参:
var formdata = new FormData()
formdata.append('file', new Blob([u8arr], {type: mime}))
xhr.send(formdata)
}
作者:Polaris_llh
链接:https://www.jianshu.com/p/67702e025ede
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。