upImgCompression(event){ // event:必傳change的event
// 壓縮圖片需要的一些元素和對象
var imgArr = [];
// 縮放圖片需要的canvas
var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');
// 選擇的文件對象
var file = event.target.files;
for(let i = 0;i<file.length;i++){
var reader = new FileReader(),
imgFile = file[i];
// 選擇的文件是圖片
if(imgFile.type.indexOf("image") == 0) {
reader.readAsDataURL(imgFile);
}else{
continue;
}
let img = new Image();
// 文件base64化,以便獲知圖片原始尺寸
reader.onload = function(e) {
img.src = e.target.result;
};
var imgP = new Promise(function (resolve,reject) {
// base64地址圖片加載完畢后
img.onload = function() {
// 圖片原始尺寸
var originWidth = this.width;
var originHeight = this.height;
// 最大尺寸限制
var maxWidth = 400,
maxHeight = 400;
// 目標尺寸
var targetWidth = originWidth,
targetHeight = originHeight;
// 圖片尺寸超過400x400的限制
if(originWidth > maxWidth || originHeight > maxHeight) {
if(originWidth / originHeight > maxWidth / maxHeight) {
// 更寬,按照寬度限定尺寸
targetWidth = maxWidth;
targetHeight = Math.round(maxWidth * (originHeight / originWidth));
} else {
targetHeight = maxHeight;
targetWidth = Math.round(maxHeight * (originWidth / originHeight));
}
}
// canvas對圖片進行縮放
canvas.width = targetWidth;
canvas.height = targetHeight;
// 清除畫布
context.clearRect(0, 0, targetWidth, targetHeight);
// 圖片壓縮
context.drawImage(img, 0, 0, targetWidth, targetHeight);
var base64 = canvas.toDataURL("image/png",0.8);
resolve(base64);
};
});
imgArr.push(imgP);
}
return Promise.all(imgArr);
}
<input type="file" multiple accept="image/*" onchange="handleImgUpload"/>
// 使用方法 upImgCompression(event).then(res=>{ // 結果 console.log(res); })


經常遇到多圖片上傳,然后轉成base64。在不壓縮的情況下會特別的大。因為經常用我就簡單的封裝下,圖片壓縮成功以后會轉成base64並放到數組里面返回。
因為是用es6寫的需要babel轉成es5瀏覽器才能支持。
