业务中有一段涉及到处理canvas的图片然后将内容进行上传,后测试发现在IE中不好使哎...
查找了下MDN,发现中文和英文页面对于该对象的兼容性竟然不同。
在IE系列中(edge不算),File
对象是不支持的,检测方法,typeof
即可。
问题来了,我原先的代码是通过File
对象添加到FormData
中,然后提交到后台,不支持File
怎么办?起码要IE10 /11能用吧。
解决方法:通过Blob来添加到FormData中
原有代码
var id = canvas.getAttribute('id');
var dataurl = canvas.toDataURL('image/png');
var arr = dataurl.split(',');
var mime = arr[0].match(/:(.*?);/)[1];
var suffix = mime.split('/')[1];
var bstr = atob(arr[1]);
var n = bstr.length;
var u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
//注意此处
var file = new File([u8arr], id+'.'+suffix, {type: mime});
var fd = new FormData();
fd.append('file',file);
fd.append("module",'read');
return new Promise(function(resolve,reject){
$.ajax({
type : 'post',
url : base+'***',
data : fd,
processData: false,
contentType:false,
success : function(res){
res = JSON.parse(res);
if(res.state == 'SUCCESS'){
resolve(res);
}else{
reject(res.msg);
}
},
error : function(e){
reject("图片信息保存失败,请刷新后重试!");
}
});
});
替换Blob后的代码
var id = canvas.getAttribute('id');
var dataurl = canvas.toDataURL('image/png');
var arr = dataurl.split(',');
var mime = arr[0].match(/:(.*?);/)[1];
var suffix = mime.split('/')[1];
var bstr = atob(arr[1]);
var n = bstr.length;
var u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
//从此处开始处理blob
var blob = null;
try{
blob = new Blob([u8arr.buffer],{type : mime});
}catch(e){
var BlobBuilder = window.BlobBuilder = (
window.BlobBuilder ||
window.WebKitBlobBuilder ||
window.MozBlobBuilder ||
window.MSBlobBuilder
);
if (e.name === "TypeError" && BlobBuilder) {
var builder = new BlobBuilder();
builder.append(buff);
blob = builder.getBlob(fileType);
}
}
var fd = new FormData();
//一定要注意这里。
fd.append('file',blob,id+'.'+suffix);
fd.append("module",'read');
return new Promise(function(resolve,reject){
$.ajax({
type : 'post',
url : base+'***',
data : fd,
processData: false,
contentType:false,
success : function(res){
res = JSON.parse(res);
if(res.state == 'SUCCESS'){
resolve(res);
}else{
reject(res.msg);
}
},
error : function(e){
reject("图片信息保存失败,请刷新后重试!");
}
});
});
书写的时候请注意此处:fd.append('file',blob,fileName);
参考:
https://developer.mozilla.org/en-US/docs/Web/API/Blob
https://developer.mozilla.org/en-US/docs/Web/API/File/File#Browser_compatibility