目的: 帮助开发者快速开发上传头像功能点css
背景: 如今b,g能搜到的头像上传插件并不太好用,因此想提供一个比较自由度的上传而且能够剪切的插件。html
资源: 具体资源请查看这里git
<!--more-->github
cropper.js [点这里](https://github.com/fengyuanchen/cropperjs)
$(function () { var URL = window.URL || window.webkitURL; var $image = $('#image'); var $rotate = $('#userImg_rotate'); var $reUpload = $('#userImg_reUpload'); var $zoomOut = $('#userImg_zoomOut'); var $zoomIn = $('#userImg_zoomIn'); var $save = $('#userImg_save'); var croppable = false; var $previews = $('.userImg_preview'); var options = { aspectRatio: 1, viewMode: 1, built: function () { croppable = true; }, build: function (e) { var $clone = $(this).clone(); $clone.css({ display: 'block', width: '100%', minWidth: 0, minHeight: 0, maxWidth: 'none', maxHeight: 'none' }); $previews.css({ width: '100%', overflow: 'hidden' }).html($clone); }, crop: function (e) { var imageData = $(this).cropper('getImageData'); var previewAspectRatio = e.width / e.height; $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 }); }); } }; var originalImageURL = $scope.userInfo_imgUrl; var uploadedImageURL; $scope.initCropper = function(){ // init $image.attr('src',$scope.userInfo_imgUrl).cropper(options); }; // rotate $rotate.on('click', function(){ $image.cropper('rotate', 90); }); // zoomOut $zoomOut.on('click',function(){ $image.cropper('zoom', -0.1); }); // zoomIn $zoomIn.on('click',function(){ $image.cropper('zoom', 0.1); }); // Move /*$move.on('click',function(){ $image.cropper('setDragMode'); });*/ // reUpload $reUpload.on('click',function(){ $image.cropper('destroy').attr('src', $scope.userInfo_imgUrl).cropper(options); if (uploadedImageURL) { URL.revokeObjectURL(uploadedImageURL); uploadedImageURL = ''; } }); // Keyboard $(document.body).on('keydown', function (e) { if (!$image.data('cropper') || this.scrollTop > 300) { return; } switch (e.which) { case 37: e.preventDefault(); $image.cropper('move', -1, 0); break; case 38: e.preventDefault(); $image.cropper('move', 0, -1); break; case 39: e.preventDefault(); $image.cropper('move', 1, 0); break; case 40: e.preventDefault(); $image.cropper('move', 0, 1); break; } }); // 剪切和肯定上传图片 $save.on('click',function(){ common.Loading.show(); $('#image').cropper('getCroppedCanvas').toBlob(function (blob) { var formData = new FormData(); formData.append('photoFile', blob); // 这里写入后端给你的上传接口 $.ajax(API_URL+'', { method: "POST", data: formData, headers: { 'auth-token' : common.Cookie.get('token') }, processData: false, contentType: false, success: function (res) { common.Loading.hide(); common.Toast.show('头像上传成功!'); try{ $scope.$apply(function(){ $scope.isShowUnCompleteInfoBox = false; $scope.isShowCompleteInfoBox = false; $scope.userInfo_imgUrl = res.data; }) }catch(err){ console.log(err) } }, error: function () { common.Toast.show('头像上传失败!'); } }); }); }) // 上传图片,这里传本地的图片而且获取一个本地图片的路径 var $inputImage = $('#inputImage'); if (URL) { $inputImage.change(function () { var files = this.files; var file; if (!$image.data('cropper')) { return; } if (files && files.length) { file = files[0]; if (/^image\/\w+$/.test(file.type)) { if (uploadedImageURL) { URL.revokeObjectURL(uploadedImageURL); } uploadedImageURL = URL.createObjectURL(file); $image.cropper('destroy').attr('src', uploadedImageURL).cropper(options); $inputImage.val(''); } else { common.Toast.show('请选择图片再上传!') } } }); } else { $inputImage.prop('disabled', true).parent().addClass('disabled'); } });