需求:上传多张图片后,需要手动拖拽排序,传给java后台 file
用angularjs,sortablejs

简单的demo

需要引入的js文件

<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script><script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script><script src="https://cdn.staticfile.org/angular.js/1.6.6/angular.min.js"></script><script src="sortable/sortable.js"></script>

html

<body ng-app="app">    <div ng-controller="sortCtrl">        <ul class="list_img clearfix" ui-sortable="sortableOptions" ng-model="imgshows">            <li ng-repeat="imageSrc in imgshows track by $index" >                     <!--//显示图片-->                <img ng-src="{{imageSrc}}"   alt="" />                 <!--//删除按钮-->                <i ng-click="uploadimg_del($index, imgshows)" style="display: inline-block;position: absolute; top: -10px; right: -2px; cursor: pointer;">×</i>            </li>            <li class="add_btn">                <label class="bgimg" for="fileImg"></label>                <div class="file-box">                    <img id="imgShow" onclick="$('#fileImg').click();"  src="img/systemicon_nav_img_18.png"/>                    <input type="file"  style="display: none;" name="upload_img" file="upload_img"  accept="image/*" class="file-btn" id="fileImg" />                </div>            </li>        </ul>    </div></body>

style样式

<style>    .list_img{        list-style: none;    }    .list_img li{        position: relative;        float: left;        margin-right: 20px;    }    .list_img li img{        width: 100px;        height: 80px;    }</style>

js内容

<script>var app = angular.module("app", ["ui.sortable"]);app.controller("sortCtrl", function($scope, $timeout) {    //拖拽排序    $scope.sortableOptions = {        // 数据有变化        update: function(e, ui) {            console.log("update");        },        // 完成拖拽动作        stop: function(e, ui) {            //do nothing            console.log("do nothing");        }    }    //图片---------    $scope.imgshows = [];    $scope.uploadimgs = []; //上传图片合集放的是file对象    //删除单图    $scope.uploadimg_del = function(index, imgs) {        $scope.imgshows.splice(index, 1);        $scope.uploadimgs.splice(index, 1);        console.log($scope.imgshows);        console.log($scope.uploadimgs);  }        //提交给后台图片及其它信息    $scope.addSample = function(sample, loding) {        $scope.isSubmit();        var fd = new FormData(); //初始化一个FormData实例        //传值file        for (var i = 0; i < $scope.uploadimgs.length; i++) {            fd.append('file', $scope.uploadimgs[i])        }        if ($scope.sampleForm.$valid && $scope.uploadimgs.length > 0) {            $loading.start(loding);            //正常提交表单            $http({                method: 'post',                data: fd,                headers: { 'Content-Type': undefined },                transformRequest: angular.identity,                url: baseUrl + 'list_up/'            }).then(function(response) {                $loading.finish(loding);                $scope.confirm(response.data.message);            }, function() {                $loading.finish(loding);                $scope.alert('提交失败请与管理员联系!');            })        } else {            // $scope.submitted = true;            $scope.alert('提交失败正确填写!');        }    }})    //图片读取,工厂函数app.factory('fileReader', ['$q', '$log', function($q, $log) {    var onLoad = function(reader, deferred, scope) {        return function() {            scope.$apply(function() {                deferred.resolve(reader.result);            });        };    };    var onError = function(reader, deferred, scope) {        return function() {            scope.$apply(function() {                deferred.reject(reader.result);            });        };    };    var getReader = function(deferred, scope) {        var reader = new FileReader(); //fileReader        reader.onload = onLoad(reader, deferred, scope);        reader.onerror = onError(reader, deferred, scope);        return reader;    };    var readAsDataURL = function(file, scope) {        var deferred = $q.defer();        var reader = getReader(deferred, scope);        //将图片转换为Base64        reader.readAsDataURL(file);        return deferred.promise;    };    return {        readAsDataUrl: readAsDataURL    };}]);//文件预览,自定义指令app.directive('file', ['$parse', 'fileReader', function($parse, fileReader) {    return {        restrict: 'A',        link: function(scope, element, attrs, ngModel) {            var model = $parse(attrs.file);            var modelSetter = model.assign;            element.bind('change', function(event) {                scope.$apply(function() {                    modelSetter(scope, element[0].files[0]);                });                //附件预览                scope.imgupload = (event.srcElement || event.target).files[0];                getFile(scope.imgupload, scope);                //获得预览图地址并且把file对象放入上传合集内                function getFile(imgupload, scope) {                    if (!imgupload) {                        return;                    }                    fileReader.readAsDataUrl(imgupload, scope)                        .then(function(result) {                            scope.imgshows.push(result);                            console.log(scope.imgshows);                            var file = document.querySelector('input[type=file]').files[0];                            scope.uploadimgs.push(file); //这里是放着传给后台的数据file,下面controller的时候会有                            console.log(scope.uploadimgs);                            angular.element(document.querySelector("#fileImg")).val('');                        });                }            });        }    };}]);</script>

例图完美~