前端文件相关数据转化
前端的文件操作涉及到的集中数据类型的相互转化总结
File
, Blob
, base64
, URL
的相互转化
File => Blob
File
本身就是继承了Blob
, 而Blob.prototype.slice()
返回一个Blob对象, 所以可以使用File
实例调用slice
函数, 从而得到一个Blob
对象
var blob = file.slice();
File => base64
var reader = new FileReader();
reader.onload = event => {
var base64 = event.target.result;
}
reader.readAsDataURL(file);
File => URL
var url = URL.createObjectURL(file);
base64 => File
要把base64
转化为其他类型的数据, 首先要借助window.atob
函数对base64
进行解析, 然后构造一个Uint8Array
, 再使用new File(...)
实例化一个File
对象
var binary = window.atob(base64.split(',')[1]);
var arr = [];
for(var i=0; i < binary.length; i++) {
arr.push(binary.charCodeAt(i));
}
var unit8Array = new Unit8Array(arr);
var file = new File([unit8Array], 'fileName'); // fileName为必须字段, 指定file的name属性
base64 => Blob
转Blob
与转File
是一样的, 只是最后使用new Blob(...)
而不是new File(...)
var binary = window.atob(base64.split(',')[1]);
var arr = [];
for(var i=0; i < binary.length; i++) {
arr.push(binary.charCodeAt(i));
}
var unit8Array = new Unit8Array(arr);
var blob = new Blob([unit8Array]);
base64 => URL
base64
无法直接转化为URL
, 不过可以借助上面的方式, 先把base64
转File
或Blob
, 再把File
或Blob
转为URL
(base64
=> File/Blob
=> URL
)
Blob => File
File
构造函数可以接受一个Blob
数组, 所以Blob
转File
实际上只要new File(...)
就可以了
var file = new File([blob], 'fileName');
Blob => base64
Blob
转base64
其实和File
转base64
是一样的, 同样借助FileReader
var reader = new FileReader();
reader.onload = event => {
var base64 = event.target.result;
}
reader.readAsDataURL(blob);
Blob => URL
URL.createObjectURL
函数可以接受一个File
或Blob
类型参数, 所以直接使用这个函数就可以把Blob
转为一个URL
var url = URL.createObjectURL(blob);
关于
FileReader
和URL
对象可以参考FileReader, URL
补充: 使用canvas对已知的图片URL进行处理
使用canvas
可以将已知地址的图片读取成blob
数据
// 获取一个可用的图片地址, 并生成一个Image对象(或img元素)
var imgUrl = "./img.png";
var image = new Image();
// 获取页面中的canvas元素
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
image.onload = function() {
canvas.width = image.width;
canvas.height = image.height;
ctx.drawImage(image, 0, 0);
canvas.toBlob(function(blob) {
console.log(blob);
});
}
image.src = imgUrl;