H5 input拍照上传图片,处理图片旋转压缩并转成file文件

之前图片上传都是上传的base64码,但是这次需要存到其他系统服务器,只接收file,所以整理了一个公共方法,主要用于移动端,PC端没有试过,包含图片的旋转,压缩和转成file文件。
初始代码是循环压缩到100kb以下的,但是压缩超过3次以后,后台接到的file开始报错,偶发性,自己测试没有复现,上了生产就有问题,所以综合考虑改为100kb以下,只旋转,大于100kb只压缩一次了,不需要循环压缩的可以参考一下。
问题还在查找,要是哪位大佬能定位并解决这一问题,将不胜感激!

上代码

html

<script src="js/faceRecognitionCommon.js" type="text/javascript" charset="utf-8"></script>
<input type="file" capture="user" class="form-control" id="facethumbnail" name="thumbnail" accept="image/*">

js部分

$('#facethumbnail').change(function(e) {
        if(!e.target.files[0]){
            return;
        }
        var size = e.target.files[0].size;
        console.log(size);
        if(size > 10240*1024){
            $scope.vo.faceidMessage = "图片大小不能超过10MB,请重新上传";
            $(".alertmessage").fadeIn(0);
            return;
        }
        faceRecognitionCommon(e,facecheck);
    });

faceRecognitionCommon.js部分

var num = 1;
function faceRecognitionCommon(file,getImageFile){//file标识input上传的event,getImageFile是拿到file文件后回调
  cutImageBase64Common(file,getImageFile);
};
//压缩
function cutImageBase64Common (e,getImageFile) {
    var file = e;
    num++;
    var URL = window.URL || window.webkitURL;
    var blob = URL.createObjectURL(file);
    var img = new Image();
    img.src = blob;
    img.onload = function() {
      if(size >= 100){
          compressCommon(img, file.type,e,getImageFile,2);//2表示压缩比例
      }else {
          compressCommon(img, file.type,e,getImageFile,1);//1表示压缩比例
      }
    }
};
//上传
function getFilesizeaCommon(e,getImageFile){
    var fileName = new Date().getTime() + ".jpg";
    var file = new File([e],fileName,{ type: "image/jpg" });
    var size = file.size/1024;
    console.log("图片大小"+size+"kb");
    getImageFile(file);
};
//压缩
function changeImageToFileCommon(base64,getImageFile){
    var blob = dataURLtoBlobCommon(base64);
    var file1 = blobToFileCommon(blob, "1.jpg");
    var fileName = new Date().getTime() + ".jpg";
    var file = new File([file1],fileName,{ type: "image/jpg" });
    var size = file.size/1024;
    // if(size >= 100){
    //   cutImageBase64Common(file,getImageFile);
    //   return;
    // }
    console.log(file);
    getFilesizeaCommon(file,getImageFile);
};

//旋转位置
function compressCommon(img, fileType,e,getImageFile,num) {
    var canvas = document.createElement("canvas");
    var rotateshow;
    console.log(img);
    EXIF.getData(img, function(){
      EXIF.getAllTags(img);
      window["Orientation"] = EXIF.getTag(img,'Orientation');
      console.log(Orientation);
      switch (Orientation){
        case 6:
          rotateshow = rotateImgCommon(img,'left',canvas,fileType,getImageFile,num);
          break;
        case 8:
          rotateshow = rotateImgCommon(img,'right',canvas,fileType,getImageFile,num);
          break;
        case 3:
          rotateImgCommon(img,'right',canvas,fileType,getImageFile,num);
          rotateshow = rotateImgCommon(img,'right',canvas,fileType,getImageFile,num);
          break;
        case undefined:
          rotateshow = rotateImgCommon(img,'center',canvas,fileType,getImageFile,num);
          break;
        case 1:
          rotateshow = rotateImgCommon(img,'center',canvas,fileType,getImageFile,num);
          break;
        default:
          rotateshow = rotateImgCommon(img,'center',canvas,fileType,getImageFile,num);
      }
    });
};
function rotateImgCommon(img, direction,canvas,fileType,getImageFile,num) {
    var min_step = 0;
    var max_step = 3
    if (img == null)return;
    //img的高度和宽度不能在img元素隐藏后获取,否则会出错
    var height = img.height/num;
    var width = img.width/num;
    var step = 2;
    if (step == null) {
      step = min_step;
    }
    if (direction == 'right') {
      step++;
      //旋转到原位置,即超过最大值
      step > max_step && (step = min_step);
    } else if (direction == 'left') {
      step--;
      step < min_step && (step = max_step);
    } else {
      step = min_step;
    }
    var degree = step * 90 * Math.PI / 180;
    var ctx = canvas.getContext('2d');
    console.log(step);
    switch (step) {
      case 0:
        canvas.width = width;
        canvas.height = height;
        ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
        break;
      case 1:
        canvas.width = height;
        canvas.height = width;
        ctx.rotate(degree);
        ctx.drawImage(img, 0, -height, canvas.height, canvas.width);
        break;
      case 2:
        canvas.width = width;
        canvas.height = height;
        ctx.rotate(degree);
        ctx.drawImage(img, -width, -height, canvas.width, canvas.height);
        break;
      case 3:
        canvas.width = height;
        canvas.height = width;
        ctx.rotate(degree);
        ctx.drawImage(img, -width, 0, canvas.height, canvas.width);
        break;
    }
    var base64 = canvas.toDataURL(fileType);//也可以canvas.toDataURL(fileType,"压缩质量0-1");
    changeImageToFileCommon(base64,getImageFile);
};
//base64码转换成file文件
function dataURLtoBlobCommon(dataurl) {
    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);
    }
    return new Blob([u8arr], { type: mime });
};
//将blob转换为file
function blobToFileCommon(theBlob, fileName){
    theBlob.lastModifiedDate = new Date();
    theBlob.name = fileName;
    return theBlob;
};

补充:

new File()----ios低版本不兼容,也可以直接传blob,blob和file的区别可自行查询,不再赘述。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
使用规范:  var file = $("#file_input")[0].files[0]; if(file.size / 1024 > 1024 * 5){ mui.toast('图片不能超过5M'); return; } //图片压缩 compress.rotatePhotoCompress(file,function(imageObj){ var formData = new FormData(); formData.append("uploadFile", imageObj, file.name); // 文件对象 //图片上传 uploadAdd(formData); }); /** * 图片上传 * @param formData */ function uploadAdd(formData){ var URL = apiUrl.addMultImageURL+"?plateTag=order&fileOwnerId=order&fileType=image&token;="+app.getToken(); $.ajax({ url: URL, //请求地址 type: "post", async: true, //默认为异步 data: formData, //参数 contentType: false, //数据请求格式 processData:false, xhr:function(){ myXhr = $.ajaxSettings.xhr(); if(myXhr.upload){ // check if upload property exists myXhr.upload.addEventListener('progress',function(e){ //显示进度条 $("#progress1").show(); var loaded = e.loaded;//已经上传大小情况 var tot = e.total;//附件总大小 var per = Math.floor(100*loaded/tot); //已经上传的百分比 mui("#progress1").progressbar({progress:per}).show(); }, false); // for handling the progress of the upload } return myXhr; },// 成功 success: function (data) { //隐藏进度条 $("#progress1").hide(); if (data.error == 0 && null != data.url) { mui.toast('上传图片成功'); $('.show_img').append("<div class='imgList'><span class='oClose'>X</span><img src="+app.fileUrl+data.url+"><input type='hidden' name='imgUrls["+count+"]' value="+data.url.replace(app.fileUrl,"")+"></div>"); count++; } else { mui.toast('上传图片失败'); $('#uploadPicButton').html('请你选择图片重新上传'); } }, error:function(rep) { $("#progress1").hide(); console.log(JSON.stringify(rep)); mui.toast('上传异常'); } }) }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请叫我大豆包

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值