layui在上传图片在前端处理图片压缩

有的人会遇到需要在前端代码处理图片压缩的问题,下面给大家分享怎么处理。

// 上传图片

var image_src

var IsImgDeal=false;

layui.upload.render({

elem: "#{tag}{id}",

url: sessionStorage.getItem('httpUrlPrefix') + '/upload/uploadImage',

// dataType: 'text',

// auto: false,

// multiple: true,

accept:"images",

exts: 'jpg|png|jpeg',

acceptMime:"image/jpeg,image/png",

before: function (obj) {

layer.msg("图片上传中...", { icon: 16, shade: 0.01 })

},

done: function(res){

layer.msg(`<div style="display:flex;"><div class="tipsSuccess"></div>

<div class="titleTips">提示

</div>

</div>

<div class="context" ><br>上传成功!</div>`

, {

skin: 'success-class',

time: 1000

});

layer.closeAll('loading'); //关闭loading

console.log("sfafasfa",JSON.stringify(res))

image_src = res.url

IsImgDeal = false;

},

choose: function (obj) {

obj.preview(function (index, file, result) {

console.log("================>",file)

let filename = file.name

// console.log("================>",result)

//临时存储二进制流

$("#uploadnewImg-{id}").hide()

$("#uploadexistimg-{id}").show()

$("#uploadImg-{id}").attr("src", result);

});

if (IsImgDeal) {

return;//图片处理过就直接上传

}

console.log("图片压缩开始处理");

var files = obj.pushFile();

var file_tar = null,index_tar = null;

for (var k in files) {

index_tar = k;

file_tar = files[k];

break;

}

//进行图片压缩,直接百度压缩方法

let reader = new FileReader();

var filename = file_tar.name;

reader.readAsDataURL(file_tar);

reader.onload = function () {

let content = this.result; //图片的src,base64格式

let img = new Image();

img.src = content;

img.onload = function () { //图片加载完毕

let canvas = document.createElement("canvas");

let ctx = canvas.getContext('2d');

let width = Math.ceil(img.width*0.8);

let height = Math.ceil(img.height*0.8);

canvas.width = width;

canvas.height = height;

ctx.drawImage(img, 0, 0, width, height);//压缩图片尺寸

let dataURL = canvas.toDataURL("image/jpeg");//如果是需要质量压缩就补充参数

//将base64数据转化为文件对象

var 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);

}

IsImgDeal = true;//设置标记

//如果有时差问题,后面setTimeout延时再执行,让原来的上传终止

obj.upload(index_tar, new File([new Blob([u8arr], { type: mime })], filename));//单独上传

//uploadIns.upload();//重新启动全部文件上传

}

};

layer.load(); //上传loading

//停止原本的上传,如果多个文件,需要在读取完毕后将files里面的文件队列全删除。

return delete files[index_tar];

},

});

相关推荐
烂蜻蜓27 分钟前
前端已死?什么是前端
开发语言·前端·javascript·vue.js·uni-app
Rowrey2 小时前
react+typescript,初始化与项目配置
javascript·react.js·typescript
谢尔登2 小时前
Vue 和 React 的异同点
前端·vue.js·react.js
祈澈菇凉6 小时前
Webpack的基本功能有哪些
前端·javascript·vue.js
小纯洁w6 小时前
Webpack 的 require.context 和 Vite 的 import.meta.glob 的详细介绍和使用
前端·webpack·node.js
想睡好7 小时前
css文本属性
前端·css
qianmoQ7 小时前
第三章:组件开发实战 - 第五节 - Tailwind CSS 响应式导航栏实现
前端·css
记得早睡~7 小时前
leetcode150-逆波兰表达式求值
javascript·算法·leetcode
zhoupenghui1687 小时前
golang时间相关函数总结
服务器·前端·golang·time
White graces7 小时前
正则表达式效验邮箱格式, 手机号格式, 密码长度
前端·spring boot·spring·正则表达式·java-ee·maven·intellij-idea