程序员

数据上传的实时进度显示【进度条】

2016-10-27  本文已影响1790人  月寒兮夜凉
优秀文章

开源中国:今天来找bug


相关框架

前台:AngularJS、Bootstrap
后台:SpringMVC


思路整理

JS代码
// 服务
$interval

// 属性
$scope.uploadProgress = {};
$scope.uploadProgressFlag = false;

// 方法
$scope.upload = function() {
    // 上传实现代码(略)
    ...
    // 验证进度当前状态,此操作可实现主动取消上传
    if(!$scope.uploadProgressFlag){
        // 标记进度开始状态true
        $scope.uploadProgressFlag = true;
        // 初始化进度值
        $scope.uploadProgress.value = 0;
        // 进度开始
        var start = $interval(function(){
            // 首先判断进度是否取消决定是否主动结束
            if(!$scope.uploadProgressFlag){
                $interval.cancel(start);
                // 初始化进度值
                $scope.uploadProgress.value = 0;
                // 终止后台上传方法(略)
                ...
            }else if($scope.uploadProgress.value<1){
                $http.post('./xxxController/getProgress').success(
                    function(data) {
                        // 通过访问后台获取当前上传真实进度
                        $scope.uploadProgress.value = data;
                    }
                );
            }else{
                // 进度自然结束
                $interval.cancel(start);
                $scope.uploadProgressFlag = false;
            }
        }, 500);
    }else{
        // 若为开始状态再次点击则为取消false,此时值的改变可被已经开始的进度获取从而停止进度
        $scope.uploadProgressFlag = false;
    };
};

HTML代码

ps:为实现想要的效果(进度填充选择文件的输入框),特请我的伙伴给予的样式调整。

<div class="row">
    <div class="col-md-4">
        <div ng-class="{progress: true, 'progress-striped': true}" class="custom-progress">
            <div ng-class="['progress-bar', 'progress-bar-info']" ng-style="{width: uploadProgress.value*100 +'%'}"></div>
            <div class="custom-progress-text">{{uploader.queue[0].file.name}}</div>
        </div>
    </div>
    <div class="col-md-3">
        <input type="file" id="stFile" nv-file-select="" uploader="uploader" ng-click="clear()" ng-show="false"/>
        <button class="btn btn-primary" ng-if="uploader" onclick="javascript:$('#stFile').click()">选择文件</button>
        <button type="button" class="btn btn-primary" ng-if="!uploadProgressFlag" ng-click="upload()">导入</button>
        <button type="button" class="btn btn-primary" ng-if="uploadProgressFlag"  ng-click="upload()">取消</button>
    </div>
</div>

实现效果

ps:进度条左上的状态和右上的百分比均可在每次获取进度的同时进行属性赋值进而实现动态改变的效果。


进度条.png
最后
上一篇 下一篇

猜你喜欢

热点阅读