断点续传前后端源码

 js不分

/***
 * 断点续传
 * @param obj
 */
//创建文件、进度、按钮等
function  progressUpload(obj){
     var files = obj.files;
     var p = new Promise(function(resolved){ 
         $(obj).parents(".fileDiv").eq(0).parent().find(".partitionUpload").remove();
        if (files.length) {
            let str = '<div class="col-xs-12 partitionUpload"  >';
            for (var i = 0; i < files.length; i++) {
                var file = files[i];
                str += '<div class="col-xs-10 '+file.lastModified+'" style="position:relative; left: 16.3%; padding-bottom: 10px;" >';
                str += "<span>"+file.name+"</span>"
                str += "<span>"
                      +"<i ><b style='padding: 12px; color: #00cc33;'>0%</b></i>"
                      +"</span>"
                      
                str +=  "<span>"
                       +"<a style='color: #d9534f;background-color: transparent;border: #d9534f 1px solid; border-radius: 3px; padding: 2px 7px; font-size: 12px;' href='javascript:void(0);' class='upload1' οnclick=\"pauseUpload1('"+file.lastModified+"','"+file.name+"',this)\">暂停</a>&nbsp;"
                       +"<a style='color: #d9534f;background-color: transparent;border: #d9534f 1px solid; border-radius: 3px; padding: 2px 7px; font-size: 12px; display:none' href='javascript:void(0);' class='upload2' οnclick=\"pauseUpload2('"+file.lastModified+"','"+file.name+"',this)\">继续</a>&nbsp;"
                       +"<a style='color: #d9534f;background-color: transparent;border: #d9534f 1px solid; border-radius: 3px; padding: 2px 7px; font-size: 12px;' href='javascript:void(0);' οnclick=\"deleteItem('"+file.lastModified+"','"+file.name+"',this)\">删除</a>"
                       +"</span>"
                       +'</div>';
            }
            str += '<div>';
            //加载上传样式
            $(obj).parents(".fileDiv").after(str);
            resolved("wo成功了");
           
        }
   }) ;
     p.then(function(result){
      window.setTimeout(function(){
          //开始上传
          pload(files,obj)
      },100)
    });
}     

//循环文件,上传
function pload(files,obj){
    for (var i = 0; i < files.length; i++) {
        //上传
        var file = files[i];
        uploadItem(file,obj);
    }
}
//切片大小  1M
 var paragraph  = 1024 *1024; 


 // 从start字节处开始上传
 function uploadItem(file,obj) {
     if(file){
         var endSize = getLastestUploadEndSize(file);
         var part = getLastestUploadPart(file);
         var uploadState = getLastestUploaduploadState(file);
         var  fd = new FormData();
        
         if(uploadState == 1 && endSize <= file.size){
             startSize = endSize;
            if(paragraph > (file.size - endSize)){
                endSize = file.size;
            }else{
                endSize += paragraph ;
            }
              //新建一个FormData对象
             
            fd.append("fileName",file.name);
            fd.append("lastModified",file.lastModified);
            fd.append("functionFileName","partitionUpload");
            fd.append("part",part);
            fd.append("file",file.slice(startSize, endSize));
            
            if(endSize == file.size){
                fd.append("end",1);
            }else{
                fd.append("end",0);
            }
            //上传
            uploadBuffer(fd,obj);
            //更新进度
            uploadProgress(endSize,file);
            var progress = localStorage.getItem(file.lastModified + "_" + file.name+"progress")
            $(obj).parents(".fileDiv").next().find("."+file.lastModified).find("b").text(progress+"%");
            //如果是最后一部分,则结束迭代
            if(endSize == file.size ){
                //上传完毕,暂停按钮关闭
                $(obj).parents(".fileDiv").next().find("."+file.lastModified).find(".upload1").hide();
            }else{
                window.setTimeout(function(){
                //迭代执行本方法
                uploadItem(file,obj);
                
                },300)
            }
           
         }
     }
 }
 
 //【暂停/继续】 状态
 function getLastestUploaduploadState(uploadFile){
     var uploadState = localStorage.getItem(uploadFile.lastModified + "_" + uploadFile.name+"uploadState");
     if(uploadState == null){
         uploadState = 1;
     }
     return  uploadState ; 
 }
 //上传的第几部分
   function getLastestUploadPart(uploadFile){
      var time = localStorage.getItem(uploadFile.lastModified + "_" + uploadFile.name+"time");
      if(time == null){
          time = 1;
      }
      return  time ; 
  }
  //暂停
  function pauseUpload1(lastModified,name,obj){
      localStorage.setItem(lastModified + "_" + name+"uploadState",2);
      $(obj).hide();
      $(obj).next().show();
  }
  //继续
  function pauseUpload2(lastModified,name,obj){
      localStorage.setItem(lastModified + "_" + name+"uploadState",1);
      $(obj).hide();
      $(obj).prev().show();
      var inputObject = $(obj).parents(".partitionUpload").eq(0).prev().find("[type=file]");
      var files = inputObject[0].files;
      var targetfile ;
      for(var i =0;i<files.length;i++){
          var file =files[i]; 
          if(file.lastModified == lastModified){
              targetfile = file;
          }
      }
      uploadItem(targetfile,$(inputObject));
  }
  //删除
  function deleteItem(lastModified,name,obj){
     localStorage.removeItem(lastModified + "_" + name);
      localStorage.removeItem(lastModified + "_" + name+"uploadState");
      localStorage.removeItem(lastModified + "_" + name+"time");
      $(obj).parents(".col-xs-12").eq(0).remove();
  }
 /**
  * 从localStorage检查最后一次上传的字节
  */
 function getLastestUploadEndSize(uploadFile){
     var lastestLen = localStorage.getItem(uploadFile.lastModified + "_" + uploadFile.name);
         if(lastestLen){
             return parseInt(lastestLen);
         }else{
             localStorage.removeItem(uploadFile.lastModified + "_" + uploadFile.name);
             return 0;
         }
     }
   //显示处理进程
 function uploadProgress(uploadLen,uploadFile) {
     var percentComplete = Math.round(uploadLen * 100 / (uploadFile.size));
    // document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%';
     localStorage.setItem(uploadFile.lastModified + "_" + uploadFile.name+"progress",percentComplete);
     var time = localStorage.getItem(uploadFile.lastModified + "_" + uploadFile.name+"time");
     if(time == null){
         time = 1;
     }
     //保存到LocalStorage一边下次传输,可以记忆起这个断点
     localStorage.setItem(uploadFile.lastModified + "_" + uploadFile.name, uploadLen);
     localStorage.setItem(uploadFile.lastModified + "_" + uploadFile.name+"time", parseInt(time)+1);
      
 }
 // 往后台传参
 function uploadBuffer(formData,obj){
    $.ajax({
        url:'../intelligenceDataThird/partitionUpload.do',
        type:'post',
        async:false,
        data:formData,
        processData:false,  //tell jQuery not to process the data
        contentType: false,
        success:function(d){
           if(formData.get("end") == 1){
               var name =  $(obj).attr("name");
               var  lastModified= formData.get("lastModified")
               $(obj).parents(".fileDiv").next().find("."+lastModified).find(".upload1").before("<input type='hidden' name='"+name+"' value='"+d.url+"'>");
               localStorage.setItem(lastModified + "_end" ,"end");
                  var files = obj.files;
                  var isOver=true;
                  for(var i =0;i<files.length;i++){
                      var file =files[i]; 
                      var endflag = localStorage.getItem(file.lastModified + "_end")
                      if(endflag != "end"){
                          isOver=false;
                          break
                      }
                  }
                  if(isOver){
                      //结束后清除localStorage
                        localStorage.removeItem(file.lastModified + "_" + file.name);
                        localStorage.removeItem(file.lastModified + "_" + file.name+"uploadState");
                        localStorage.removeItem(file.lastModified + "_" + file.name+"time");
                        localStorage.removeItem(file.lastModified + "_end");
                      $(obj).val("");
                  }
           }
        }
    })
 }

后台代码

 /**断点续传
     * @param file
     * @param fileName
     * @param part
     * @return
     */
    @ResponseBody
    @RequestMapping("/partitionUpload.do")
    public Map<String,Object> partitionUpload(HttpServletResponse response ,@RequestParam("file") MultipartFile file,String fileName,String functionFileName,Integer part,Integer end) {
        // 定义上传路径
        MyUtils myUtils = new MyUtils();
           String fileUplodPath = myUtils.getWechatProperty("fileUploadPath", "config");
           String uploadDirectory=myUtils.getWechatProperty("fileAccessApacheUrl", "config");
           if(StringUtils.isNotBlank(functionFileName)){
               functionFileName ="partitionUpload";
           }
           Map<String,Object> map = new HashMap<>();
           try {
               if (file != null ) {
                   String time =String.valueOf(new Date().getTime());
                   SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd");
                   String date = formatter.format(new Date());
                   String suffix =  fileName.substring(fileName.lastIndexOf("."));;
                if(part.equals(1) && end.equals(1)){
                    //文件小,没有分割
                    String tempFile = fileUplodPath + functionFileName + File.separator + time+suffix;  
                    File localFile = new File(tempFile);  
                    localFile.mkdirs();
                    file.transferTo(localFile);
                    map.put("url", uploadDirectory+ functionFileName +File.separator +time+suffix+"|"+fileName);
                }else{
                    if(end.equals(1)){
                        map.put("url", uploadDirectory+ functionFileName +File.separator + date + File.separator + fileName +"|"+fileName);
                     }
                    String tempFile = fileUplodPath + functionFileName + File.separator + date + File.separator + fileName;
                    File localFile = new File(tempFile);
                    if(!localFile.exists()){
                        //第一次传输,创建文件
                        localFile.mkdirs();
                        file.transferTo(localFile);
                    }else{
                        //续写文件
                        InputStream inputStream =file.getInputStream();
                        //true,则表示追加
                        @SuppressWarnings("resource")
                        FileOutputStream output = new FileOutputStream(localFile,true);
                        int b = 0;   
                        byte[] bytes = new byte[inputStream.available()];  
                        while (b != -1){  
                            b = inputStream.read(bytes);  
                            //4.写到输出流(out)中  
                            output.write(bytes,0,b);  
                        }
                    }
                }
                 } 
             }catch (Exception e) {
             e.printStackTrace();
             return map;
          }
        return map;
    }

效果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值