使用Layui上传图片,并进行压缩(非原创,证实可用)

这边是html

<div class="popBox pop_m"><span class="closePopBt">关闭</span>
    <div class="hr20"></div>
    <form class="layui-form" action="">
        <a href="javascript:void(0)" class="aLine margin_r15 uploadpic_btn">图片</a>            
        
            <div class="upload_piclist"> </div>
        </div>
        <div class="popBottomBt"> <a href="javascript:void(0)" class="button send_smit">发送</a> </div>
    </form>
</div>

  

贴上我自己的代码

<script>
function canvasDataURL(file, callback) { //压缩转化为base64
    var reader = new FileReader()
    reader.readAsDataURL(file)
    reader.onload = function (e) {
      const img = new Image()
      const quality = 0.5 // 图像质量
      const canvas = document.createElement('canvas')
      const drawer = canvas.getContext('2d')
      img.src = this.result
      img.onload = function () {
        canvas.width = img.width
        canvas.height = img.height
        drawer.drawImage(img, 0, 0, canvas.width, canvas.height)
        convertBase64UrlToBlob(canvas.toDataURL(file.type, quality), callback);
      }
    }
  }
 
  function convertBase64UrlToBlob(urlData, callback) { //将base64转化为文件格式
    const arr = urlData.split(',')
    const mime = arr[0].match(/:(.*?);/)[1]
    const bstr = atob(arr[1])
    let n = bstr.length
    const u8arr = new Uint8Array(n)
    while (n--) {
      u8arr[n] = bstr.charCodeAt(n)
    }
    callback(new Blob([u8arr], {
      type: mime
    }));
 }
    
    
layui.use(['layer','upload'],function() {
    var form = layui.form
	,upload = layui.upload;
	
	$(".closePopBt").on("click", function(){
		var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
		parent.layer.close(index); //再执行关闭        
	});	
	
  //多图片上传
	var upload = layui.upload;
	upload.render({
		elem: '.uploadpic_btn',
		url: '/workflow/comment/upload',
 		accept: 'images', //只允许传图片
//		size: 10240, //限制文件大小,单位 KB
		multiple: true,
                auto:false,
                choose:function(obj){
                    var files = obj.pushFile();
                    var filesArry = [];
                    for (var key in files) { //将上传的文件转为数组形式
                      filesArry.push(files[key])
                    }
                    var index = filesArry.length - 1;
                    var file = filesArry[index]; //获取最后选择的图片,即处理多选情况

                    if (navigator.appName == "Microsoft Internet Explorer" && parseInt(navigator.appVersion.split(";")[1]
                        .replace(/[ ]/g, "").replace("MSIE", "")) < 9) {
                      return obj.upload(index, file)
                    }
                    canvasDataURL(file, function (blob) {
                      var aafile = new File([blob], file.name, {
                        type: file.type
                      })
                      var isLt1M;
                      if (file.size < aafile.size) {
                        isLt1M = file.size
                      } else {
                        isLt1M = aafile.size
                      }

                      if (isLt1M / 1024 / 1024 > 2) {
                        return layer.alert('图片压缩之后还是大于2M,请压缩之后上传!');
                      } else {
                        if (file.size < aafile.size) {
                          return obj.upload(index, file)
                        }
                        obj.upload(index, aafile)
                      }
                    })
                },
		before: function(obj) {
                    //预读本地文件示例,不支持ie8
//                    obj.preview(function(index, file, result) {
//                        
//                    });
		},
		done: function(res) {
                    //上传完毕
                    $('.upload_piclist').append('<div class="uploadpic"><div class="pic"><img src="' + res.info.path_url + '" alt="' + res.info.title + '" class="layui-upload-img"></div><span attr_old_name='+res.info.title+' attr_new_name='+res.info.new_name+'  path='+res.info.path+' class="delpic_bt"></span></div>')
		}
	});

  

原文地址:https://www.cnblogs.com/aoxueshou/p/11726397.html