<input type="file" id="upload"></input>
<script type="text/javascript">
const upload = document.getElementById(‘#upload‘);
const acceptType = [‘image/png‘,‘image/jpeg‘,‘image/jpg‘];
const maxSize = 3 * 1024 *1024;
upload.addEventListener(‘change‘,function(e){
let file = e.target.files[0];
if(!file)return;
let {type:fileType,size:fileSize} = file;
if(!acceptType.includes(fileType)){
alert(`不支持${fileType}类型文件`);
upload.value = ‘‘;
return;
}
if(fileSize > maxSize){
alert(`文件大小超出3MB!`);
upload.value = ‘‘;
return;
}
convertImageToBase64(file,function(base64Image){
compress(base64Image,uploadToServer);
});
})
</script>
function convertImageToBase64(file,callback){
const reader = new FileReader();
reader.addEventListener(‘load‘,function(e){
let base64Image = e.target.result;
callback && callback(base64Image);
reader = null;
})
reader.readAsDataURL(file);
}
function compress(base64Image,callback){
const image = new Image();
let maxW = 1024,
maxH = 1024;
image.addEventListener(‘load‘,function(e){
const needCompress = false,
ratio = null;
if(image.naturalWidth > maxW){
needCompress = true;
ratio = naturalWidth / maxW;
maxH = naturalHeight/ratio;
}
if(image.naturalHeight > maxH){
needCompress = true;
ratio = naturalHeight / maxH;
maxW = naturalWidth/ratio;
}
if(!needCompress){
maxW = naturalWidth;
maxH = naturalHeight;
}
let canvas = document.createElement(‘canvas‘);
canvas.width = maxW;
canvas.height = maxH;
document.body.appendChild(canvas);
canvas.style.visibility = ‘hidden‘;
let ctx = canvas.getContext(‘2d‘);
ctx.clearRect(0,0,maxW,maxH);
ctx.drawImage(image,0,0,maxW,maxH);image是要生成的image对象
let compressedBase64Image = canvas.toDataURL(‘image/jpeg‘,0.8);
canvas.remove();
callback && callback(compressedBase64Image);
const _ratio = base64Image.length / compressedBase64Image.length;
console.log(‘图片压缩比为:‘,_ratio);
})
image.src = base64Image;
}
function uploadToServer(compressedBase64Image){
console.log(‘上传的图片为:‘ + compressedBase64Image);
axios.post({
url:‘192.168.01.02/api/upload‘,
data:{
},
headers:{
‘Content-Type‘:‘multipart/form-data‘
}
})
}
<input type="file" id="upload"/>
function convertImageToBase64(file,callback){
// 实例化FileReader对象,主要用于读取文件内容
let reader = new FileReader();
// 监听文件加载完成的事件
reader.addEventListener(‘load‘,function(e){
// 直接用reader实例的result属性拿到base64格式
// console.log(reader.result);
// e.target.result获取到文件的base64格式
// console.dir(e.target.result);
let base64Image = e.target.result;
// 执行callback()
callback && callback(base64Image);
// 将reader指向null防止内存泄漏
reader = null;
})
// 调用实例的readAsDataURL方法
reader.readAsDataURL(file);
}
function uploadToServer(compressedBase64Image){
console.log(‘上传的图片为:‘ + compressedBase64Image);
axios.post({
url:‘192.168.01.02/api/upload‘,
data:{
},
headers:{
‘Content-Type‘:‘multipart/form-data‘
}
})
}
function compress(base64Image,callback){
const image = new Image();
let maxWidth = 1024;
let maxHeight = 1024;
image.addEventListener(‘load‘,function(e){
let ratio;
let needCompress = false;
if(image.naturalWidth > maxWidth){
needCompress = true;
ratio = image.naturalWidth / maxWidth;
maxHeight = image.naturalHeight / ratio;
}
if(image.naturalHeight > maxHeight){
needCompress = true;
ratio = image.naturalHeight / maxHeight;
maxWidth = image.naturalWidth / ratio;
}
// 如果不需要压缩 那么需要获取图片的实际尺寸
if(!needCompress){
maxWidth = image.naturalWidth;
maxHeight = image.naturalHeight;
}
// 创建一个画步 画布大小 就是压缩尺寸后的图片大小
const canvas = document.createElement(‘canvas‘);
canvas.width = maxWidth;
canvas.height = maxHeight;
let ctx = canvas.getContext(‘2d‘);
ctx.clearRect(0,0,maxWidth,maxHeight);
ctx.drawImage(image,0,0,maxWidth,maxHeight);
const compressImage = canvas.toDataURL(‘image/jpeg‘,0.8);
canvas.remove();
// 此时已经拿到压缩后图片的base64格式 下面要将图片上传到服务器
callback && callback(compressImage);
const _image = new Image();
_image.src = compressImage;
_image.id = ‘chooseImage‘;
document.body.appendChild(_image);
console.log(base64Image.length/compressImage.length);压缩比
})
image.src = base64Image;
}
const upload = document.getElementById(‘#upload‘);
const acceptType = [‘image/png‘,‘image/jpeg‘,‘image/jpg‘];
const maxSize = 3 * 1024 *1024;
upload.addEventListener(‘change‘,function(e){
let file = e.target.files[0];
if(!file)return;
let {type:fileType,size:fileSize} = file;
if(!acceptType.includes(fileType)){
alert(`不支持${fileType}类型文件`);
upload.value = ‘‘;
return;
}
if(fileSize > maxSize){
alert(`文件大小超出3MB!`);
upload.value = ‘‘;
return;
}
convertImageToBase64(file,function(base64Image){
compress(base64Image,uploadToServer);
});
})
原文:https://www.cnblogs.com/gaokai/p/14995276.html