当前位置 主页 > 服务器问题 > Linux/apache问题 >

    springboot带有进度条的上传功能完整实例

    栏目:Linux/apache问题 时间:2019-11-04 10:25

    本文实例讲述了springboot带有进度条的上传功能。分享给大家供大家参考,具体如下:

    一、说明

      最近要做文件上传,在网上找了很久都没有一个全面的示例,特此记录下来分享给大家。

      1.文件上传接口可按照springboot默认实现,也可用commons-fileupload组件,本示例使用springboot默认文件上传 2.最后也有commons-fileupload组件接口示例

      2.重点在前端JS实现(也可以使用ajax上传),参考了网上大量上传文件显示进度条博客以及技术方案,在此做了一个统一的总结,方便后续使用

      3.这仅仅是一个示例,大家可根据实际需要改进。

    二、前端代码

    <!DOCTYPE html>
    <html>
    <meta charset="UTF-8" />
    <head>
    <title>文件上传</title>
    <link href="https://cdn.bootcss.com/bootstrap/3.3.2/css/bootstrap.css" rel="external nofollow" 
      rel="stylesheet">
    <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
    </head>
    <body class="container">
      <br />
      <span ></span>
      <div class="row">
        <input class="btn btn-info btn-xs" type="file" name="file" /><br />
        <div class="col-lg-5"
          >
          <div class="progress progress-striped active" >
            <div  class="progress-bar progress-bar-success"
              role="progressbar" aria-valuemin="0" aria-valuenow="0"
              aria-valuemax="100" ></div>
          </div>
        </div>
        <!-- 显示上传速度 -->
        <div  class="col-lg-2">0KB/s</div>
      </div>
      <!-- 显示文件信息 -->
      <div  class="row">
        <label name="upfileName"></label><br /> 
        <label name="upfileSize"></label><br />
        <label name="upfileType"></label><br />
      </div>
      <div class="row">
        <input class="btn btn-success btn-xs" type="button" name="upload" value="上传" />
        <input class="btn btn-success btn-xs" type="button" name="cancelUpload" value="取消" />
      </div>
    </body>
    <script type="text/javascript">
      var fileBtn = $("input[name=file]");
      var processBar= $("#progressBar");
      var uploadBtn=$("input[name=upload]");
      var canelBtn=$("input[name=cancelUpload]");
      var ot;//上传开始时间
      var oloaded;//已上传文件大小
      fileBtn.change(function() {
        var fileObj = fileBtn.get(0).files[0]; //js获取文件对象
        if (fileObj) {
          var fileSize = getSize(fileObj.size);
          $("label[name=upfileName]").text('文件名:' + fileObj.name);
          $("label[name=upfileSize]").text('文件大小:' + fileSize);
          $("label[name=upfileType]").text('文件类型:' + fileObj.type);
          uploadBtn.attr('disabled', false);
        }
      });
      // 上传文件按钮点击的时候
      uploadBtn.click(function(){
        // 进度条归零
        setProgress(0);
        // 上传按钮禁用
        $(this).attr('disabled', true);
        // 进度条显示
        showProgress();
        // 上传文件
        uploadFile();
      });
      function uploadFile(){
        var url ="/to/upload";
        var fileObj = fileBtn.get(0).files[0];
        if(fileObj==null){
          alert("请选择文件");
          return;
        }
        // FormData 对象
        var form = new FormData();
        form.append('file', fileObj); // 文件对象
        // XMLHttpRequest 对象
        var xhr = new XMLHttpRequest();
        //true为异步处理
        xhr.open('post', url, true);
        //上传开始执行方法
        xhr.onloadstart = function() {
           console.log('开始上传')
           ot = new Date().getTime();  //设置上传开始时间
           oloaded = 0;//已上传的文件大小为0
        };
        xhr.upload.addEventListener('progress', progressFunction, false);
        xhr.addEventListener("load", uploadComplete, false);
        xhr.addEventListener("error", uploadFailed, false);
        xhr.addEventListener("abort", uploadCanceled, false);
        xhr.send(form);
        function progressFunction(evt) {
          debugger;
          if (evt.lengthComputable) {
            var completePercent = Math.round(evt.loaded / evt.total * 100)
                + '%';
            processBar.width(completePercent);
            processBar.text(completePercent);
            var time = $("#time");
            var nt = new Date().getTime();   //获取当前时间
            var pertime = (nt-ot)/1000;    //计算出上次调用该方法时到现在的时间差,单位为s
            ot = new Date().getTime();     //重新赋值时间,用于下次计算
            var perload = evt.loaded - oloaded; //计算该分段上传的文件大小,单位b    
            oloaded = evt.loaded;        //重新赋值已上传文件大小
            //上传速度计算
            var speed = perload/pertime;//单位b/s
            var bspeed = speed;
            var units = 'b/s';//单位名称
            if(speed/1024>1){
              speed = speed/1024;
              units = 'k/s';
            }
            if(speed/1024>1){
              speed = speed/1024;
              units = 'M/s';
            }
            speed = speed.toFixed(1);
            //剩余时间
            var resttime = ((evt.total-evt.loaded)/bspeed).toFixed(1);
            $("#showInfo").html(speed+units+',剩余时间:'+resttime+'s');
          }
        }
        //上传成功后回调                                 
        function uploadComplete(evt) {
          uploadBtn.attr('disabled', false);
          console.log('上传完成')
        };
        //上传失败回调      
        function uploadFailed(evt) {
          console.log('上传失败' + evt.target.responseText);
        }
        //终止上传   
        function cancelUpload() {
          xhr.abort();
        }
        //上传取消后回调       
        function uploadCanceled(evt) {
          console.log('上传取消,上传被用户取消或者浏览器断开连接:' + evt.target.responseText);
        }
        canelBtn.click(function(){
          uploadBtn.attr('disabled', false);
          cancelUpload();
        })
      }
      function getSize(size) {
        var fileSize = '0KB';
        if (size > 1024 * 1024) {
          fileSize = (Math.round(size / (1024 * 1024))).toString() + 'MB';
        } else {
          fileSize = (Math.round(size / 1024)).toString() + 'KB';
        }
        return fileSize;
      }
      function setProgress(w) {
        processBar.width(w + '%');
      }
      function showProgress() {
        processBar.parent().show();
      }
      function hideProgress() {
        processBar.parent().hide();
      }
    </script>
    </html>