【裁剪,预览,上传】图片处理

整个过程分为三个部分【选择,预览图片】【裁剪】【发送到服务器】

一、选择,预览图片

思路:input[type=file]来触发选择,监听input的change事件,和H5的属性来获得url,通过url将img_dom append进来

代码:

    $("#inputs").on('change', function(e) {
        var files;
        var file;
        files = $(this).prop('files');
        if (files.length > 0) {
            file = files[0];
            if (isImageFile(file)) {
                if (this.url) {
                    URL.revokeObjectURL(this.url);
                }
                console.log(URL);
                this.url = URL.createObjectURL(file);
                this.$img = $('<img src="' + this.url + '"/>');
                $("#PhotoView").empty().html(this.$img);
            }
        }
    })

 二、裁剪

思路:裁剪采用的插件cropper.js

代码:

var avatar188;

var avatar120;

var $previews = $('.preview');
var companyName;
var companyCoor;
var companyAddr;
var CompanyType = 1;
var lastLogoType = 1;
var localLogoPath;
var logofileType = 1;//1代表默认logo 2代表用户上传 默认1



this
.$img.cropper({ viewMode : 1, dragMode : 'move', autoCropArea : 0.9, aspectRatio : 1.0, restore : false, guides : false, highlight : false, cropBoxMovable : false, cropBoxResizable : false, build : function(e) { var $clone = $(this).clone(); $previews.html($clone); }, crop : function(e) { var imageData = $(this).cropper('getImageData'); var previewAspectRatio = e.width / e.height; //调节preview $previews.each(function() { var $preview = $(this); var previewWidth = $preview.width(); var previewHeight = previewWidth / previewAspectRatio; var imageScaledRatio = e.width / previewWidth; $preview.height(previewHeight).find('img').css({ width : imageData.naturalWidth / imageScaledRatio, height : imageData.naturalHeight / imageScaledRatio, marginLeft : -e.x / imageScaledRatio, marginTop : -e.y / imageScaledRatio }); }); //保存图片 avatar188 = $(this).cropper('getCroppedCanvas', { width : 188, height : 188 }); avatar120 = $(this).cropper('getCroppedCanvas', { width : 120, height : 120 }); logofileType = 2; } });

 三、预处理,上传

思路:上传前,需要将URL转化为二进制流,然后在封装进H5的FORM对象中,提交到服务器才能被识别

代码:

function isImageFile(file) {
          if (file.type) {
            return /^image/w+$/.test(file.type);
          } else {
            return /.(jpg|jpeg|png)$/.test(file);
          }
    }

//url 转化成blob二进制数据流
    function dataURLToBlob(dataURL){
        var byteString = atob(dataURL.split(',')[1]);
        var mimeString = dataURL.split(',')[0].split(':')[1].split(';')[0];
        var ab = new ArrayBuffer(byteString.length);
        var ia = new Uint8Array(ab);
        for(var i = 0;i<byteString.length;i++){
            ia[i] = byteString.charCodeAt(i);
        }
        var blob = new Blob([ab],{type:mimeString});
        return blob;
    }
//post headImage to server
    function postImage(vm){
        //图片数据处理
        var canvas = avatar188.toDataURL("image/png");
        var imgfile = dataURLToBlob(canvas);
        var Form = new FormData();
        Form.append('pictureFile',imgfile);
        Form.append('body',1);
        $.ajax({
               url:path_+'/picServerCtrl/uploadPicture',
               type:'post',
               dataType:'json', 
               contentType:'multipart/form-data',
            data:Form,
            success : function(res){
                if(res.status){
                    zuiMessager(res.message);
                    addStaff.addStaffForm.headPicUrl=res.result.netWorkPath;
                    closeAllSwitch();
                    vm.showForm=true;
                }
            },
            cache:false,
            contentType:false,
            processData:false,
           });
        }
原文地址:https://www.cnblogs.com/cjt-cn/p/6841607.html