今天开发项目遇到了一个问题,手机端拍的图片太大,超出了华为云一次上传图片10M的限制,由于那边不方便提升限制,只能考虑前端转换了。
由于canvas压缩后,获取到的文件是base64,但是后台不做转码,要求是File这个api嘛,文件
这时候就很难了,canvas有提供File这个api嘛?在搜索完成后发现并没有提供,只有一个toDataURL获取base64
在翻遍资料后,发现了两种方法,一种是直接通过new File()将base64转换成file文件,但是这种方法要考虑浏览器兼容问题,这还需要考虑?果断放弃。
第二种就是先讲base64转blod后,再转file,虽然看起来复杂,但是实际上,代码量并不是很多,多的只是blod这一层操作复杂了点,代码如下:
let base64 = canvas.toDataURL('image/jpeg', quality );
let arr = base64.split(',')
let data = window.atob(arr[1])
let mime = arr[0].match(/:(.*?);/)[1]
let ia = new Uint8Array(data.length)
for (let i = 0; i < data.length; i++) {
ia[i] = data.charCodeAt(i)
}
let blob = new Blob([ ia ], {type: mime})
let files=new window.File([ blob ], name, {type: type})
在这里需要重点说下
在转file时,里面所携带的name,type参数,最好是从input选中图片后返回的file参数里面拿到,这样保证图片只是压缩,其他数据没有变。
现在又多了一种方法
//blod文件转换成file文件
blodToFile(theBlod,fileName){
theBlod.lastModifiedDate=new Date();
theBlod.name = fileName
return theBlod
},
let files=that.blodToFile(blob,name)
这个files拿到的,就是file文件了,给blod加入时间和名字,就会自动变成file文件,不需要用到
new window.File方法,这个方法在网上查找资料时有人说有兼容问题,虽然我目前没发现,但是保证稳妥还是使用这个第三种方法!!!
其实let也可以用const来命名,这种我没有在意,反正各有各的风格。