//base64转码(压缩完成后的图片为base64编码,这个方法可以将base64编码转回file文件) function dataURLtoFile(dataurl) { let arr, mime, bstr, n, u8arr; 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], { type: mime }); } //压缩图片 function compressImg(file){ // file = convertBase64UrlToBlob(file.content); const name = file.name; let files; let fileSize = parseFloat(parseInt(file['size'])/1024/1024).toFixed(2); let read = new FileReader(); read.readAsDataURL(file); return new Promise(function(resolve){ read.onload = function (e) { let img = new Image(); img.src = e.target.result; img.onload = function(){ //默认按比例压缩 let w = this.width, h = this.height; //生成canvas let canvas = document.createElement('canvas'); let ctx = canvas.getContext('2d'); let base64; // 创建属性节点 canvas.setAttribute("width", w); canvas.setAttribute("height", h); ctx.drawImage(this, 0, 0, w, h); if(fileSize<1){ //如果图片小于一兆 那么不执行压缩操作 base64 = canvas.toDataURL(file['type'], 1); }else if(fileSize>1&&fileSize<2){ //如果图片大于1M并且小于2M 那么压缩0.5 base64 = canvas.toDataURL(file['type'], 0.5); }else{ //如果图片超过2m 那么压缩0.2 base64 = canvas.toDataURL(file['type'], 0.2); } // 回调函数返回file的值(将base64编码转成file) files = dataURLtoFile(base64); //如果后台接收类型为base64的话这一步可以省略 let img = new File([files], name, { type: 'image/jpeg', }); //图片大小大于1024*1024,则再次压缩 if (img.size > 1024*1024) { compressImg(img).then(res=>{ img = res; resolve(img) }) }else { resolve(img) } }; }; }) } //结尾处将该方法暴露出来供外部调用 export default { compressImg, }