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];

},

});

相关推荐
2501_920931704 分钟前
React Native鸿蒙跨平台使用useState管理健康记录和过滤状态,支持多种健康数据类型(血压、体重等)并实现按类型过滤功能
javascript·react native·react.js·ecmascript·harmonyos
打小就很皮...8 分钟前
dnd-kit 实现表格拖拽排序
前端·react.js·表格拖拽·dnd-kit
Ulyanov13 分钟前
从静态到沉浸:打造惊艳的Web技术发展历程3D时间轴
前端·javascript·html5·gui开发
打小就很皮...23 分钟前
React 19 + Vite 6 + SWC 构建优化实践
前端·react.js·vite·swc
Highcharts.js25 分钟前
使用Highcharts与React集成 官网文档使用说明
前端·react.js·前端框架·react·highcharts·官方文档
这是个栗子25 分钟前
AI辅助编程(二) - 通译千问
前端·ai·通译千问
VT.馒头36 分钟前
【力扣】2625. 扁平化嵌套数组
前端·javascript·算法·leetcode·职场和发展·typescript
数研小生1 小时前
Full Analysis of Taobao Item Detail API taobao.item.get
java·服务器·前端
Shirley~~1 小时前
Vue-skills的中文文档
前端·人工智能
毎天要喝八杯水1 小时前
搭建vue前端后端环境
前端·javascript·vue.js