webuploader java分片上传

webuploader java分片上传

import java.io.File;
import java.io.FileOutputStream;
import java.util.Date;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;




@Controller
@RequestMapping(value = "upload")
public class UploadController{
    /**
     * 日志记录.
     */
    private static final Logger logger =  LoggerFactory.getLogger(UploadController.class);
    
    @RequestMapping("/showUploadhtml")
    @ResponseBody
    public ModelAndView showUploadhtml() {
        return new ModelAndView("upload/fileupload");
    }


    @RequestMapping(value = "/upload", method = { RequestMethod.POST, RequestMethod.GET })
    @ResponseBody
    public double upload(MultipartFile file,  String chunks,  String chunk,
             String name, String size, String lastModifiedDate, HttpServletRequest request, HttpServletResponse response) throws Exception {
        try {
            if (null != file) {
                long mStartTime = System.currentTimeMillis();
                //判断上传的文件是否被分片(小于1M的不会分片)
                if(null == chunks && null == chunk){
                    File destTempFile = new File(getTempFilePath1(), name);
                    file.transferTo(destTempFile);
                    destTempFile.createNewFile();
                    long size1 = destTempFile.length();
                    long mEndTime = System.currentTimeMillis();
                    double speed = Long.parseLong(size)/((mEndTime - mStartTime)*1024);
                    double speed1 = 1014/((mEndTime - mStartTime));
                    
                    System.out.println(new Date(mEndTime)+""+new Date(mStartTime));
                    System.out.println(mEndTime - mStartTime);
                    System.out.println("size:"+size+"   start time:"+mStartTime+"     end time:"+mEndTime+"    speed:"+speed);
                    System.out.println("size:"+size1+"   start time:"+mStartTime+"     end time:"+mEndTime+"    speed:"+speed1);
                    System.out.println();
                    return speed;
                }
                
                String tempFileDir = getTempFilePath()  + File.separator + name;
                File parentFileDir = new File(tempFileDir);
                if (!parentFileDir.exists()) {
                    parentFileDir.mkdirs();
                }
                File f = new File(tempFileDir + File.separator+ name + "_" + chunk + ".part");
                file.transferTo(f);
                f.createNewFile();
                long size1 = f.length();
                long mEndTime = System.currentTimeMillis();
                double speed = Long.parseLong(size)/((mEndTime - mStartTime)*1024);
                double speed1 = 1014/((mEndTime - mStartTime));
                
                System.out.println(new Date(mEndTime)+""+new Date(mStartTime));
                System.out.println(mEndTime - mStartTime);
                System.out.println("size:"+size+"   start time:"+mStartTime+"     end time:"+mEndTime+"    speed:"+speed);
                System.out.println("size:"+size1+"   start time:"+mStartTime+"     end time:"+mEndTime+"    speed:"+speed1);
                System.out.println();
                // 是否全部上传完成
                // 所有分片都存在才说明整个文件上传完成
                boolean uploadDone = true;
                for (int i = 0; i < Integer.parseInt(chunks); i++) {
                    File partFile = new File(tempFileDir, name + "_" + i + ".part");
                    if (!partFile.exists()) {
                        uploadDone = false;
                        return speed;
                    }
                }
                // 所有分片文件都上传完成
                // 将所有分片文件合并到一个文件中
                if (uploadDone) {
                    synchronized (this) {
                        File destTempFile = new File(getTempFilePath1(), name);
                        for (int i = 0; i < Integer.parseInt(chunks); i++) {
                            File partFile = new File(tempFileDir, name + "_" + i + ".part");
                            FileOutputStream destTempfos = new FileOutputStream(destTempFile, true);
                            FileUtils.copyFile(partFile, destTempfos);
                            destTempfos.close();
                        }
                        FileUtils.deleteDirectory(parentFileDir);
                    }
                }
                return speed;
            }
         
        } catch (Exception e) {
            logger.error("upload file failure :",e);
        }
        return 0;
    }
    
    private String getTempFilePath() {
        return "h:\\filetemp";
    }
    
    private String getTempFilePath1() {
        return "h:\\filetemp1";
    }
}


html

<link rel="stylesheet" type="text/css" th:href="@{../css/upload/upload.css}"/>
  <link rel="stylesheet" type="text/css" th:href="@{../lib/webuploader/webuploader.css}"/>
  <div class='cloudos-fileupload-page'>
  <!--页面头部-->
  <div class="row">
  <div class="col-xs-12">
  <h3>文件上传</h3>
  </div>
  <div class="col-xs-6">
  <div class="btns">
  <div id="picker">选择文件</div>
  <button id="uploadctlBtn" class="btn btn-primary">开始上传</button>
  <button id="stopctlBtn" class="btn btn-primary">暂停上传</button>
  </div>
  </div>
  
  <!--用来存放文件信息-->
  <div id="thelist" class="uploader-list col-xs-7"></div>
  
  <div class="col-xs-5">
  <div class="row">
  <div id="error-list" class="col-xs-12"></div>
  <div id="success-list" class="col-xs-12"></div>
  </div>
  </div>
  </div>
  </div>
  <script th:src="@{../lib/webuploader/webuploader.js}"></script>
  <script th:src="@{../js/upload/upload.js}"></script>

js


// 文件上传
jQuery(function() {
    var $ = jQuery,
    $list = $('#thelist'),
    $btn = $('#uploadctlBtn'),
    $stopctlBtn = $('#stopctlBtn'),
    /* state = 'pending',*/
    uploader;


    uploader = WebUploader.create({


        // 不压缩image
        resize: false,


        // swf文件路径
        swf:'/lib/webuploader/Uploader.swf',


        // 文件接收服务端。
        server: '/upload/upload',
        // 选择文件的按钮。可选。
        // 内部根据当前运行是创建,可能是input元素,也可能是flash.
        pick: '#picker',
        dnd: '#thelist',
        chunked:true,
        chunkSize:1024*1024,
        chunkRetry:false
    });


    // 当有文件添加进来的时候
    uploader.on( 'fileQueued', function( file ) {
        $list.append( '<div id="' + file.id + '" class="item row">' +
            '<div class="col-xs-3" >' + file.name + '</div>' +
            '<div class="col-xs-4" ><div class="progress progress-striped active"><div class="progress-bar" role="progressbar" style="width: 0%"><span></span></div></div></div>'+
            '<div class="col-xs-2" ><p class="state">等待上传...</p></div>' +
            '<div class="col-xs-2" ><span class="retry">重试</span><span class="stop"></span><span class="cancel">取消</span></div>' +
            '</div>' );
    });


    function getFilesInfo (id,file,uploadStates){
        var stateMsg;
        if (uploadStates){
            stateMsg = '上传成功';
        }else{
            stateMsg = '上传失败';
        }
        $('#'+id).append('<div id="' + file.id + '" class="item row">' +
            '<div class="col-xs-12 " >' + file.name + '<span></span></div>' +
            '</div>' );
        $('#'+id+' #'+file.id).find('span').text(stateMsg);
    }




    // 文件上传过程中创建进度条实时显示。
    uploader.on( 'uploadProgress', function( file, percentage ) {
     $percent =  $('#'+file.id).find('.progress .progress-bar');
     $( '#'+file.id ).find('p.state').text('上传中');
     $percent.css( 'width', percentage * 100 + '%' );
     $percent.find('span').text( percentage.toFixed(2) * 100 + '%' );
 });




    //上传成功
    uploader.on( 'uploadSuccess', function( file ) {
     $( '#'+file.id ).find('p.state').text('上传成功');
     $( '#'+file.id ).find('.progress-bar').css( 'background-image', "none" );
     $( '#'+file.id ).find('.cancel').remove();
     $( '#'+file.id ).find('.stop').remove();
     getFilesInfo('success-list',file,true);
 });




    //上传失败
    uploader.on( 'uploadError', function( file ) {
       $('#'+file.id).find('.retry').css('display',"block");
       $percent =  $('#'+file.id).find('.progress .progress-bar');
       $( '#'+file.id ).find('p.state').text('上传出错');
       $( '#'+file.id ).find('.progress-bar').css( 'width', 0 + '%' );
       $percent.find('span').text('0%');
       $( '#'+file.id ).find('.cancel').remove();
       $( '#'+file.id ).find('.stop').remove();
       getFilesInfo('error-list',file,false);
       retry(file);
   });


   /* uploader.on( 'all', function( type ) {
        if ( type === 'startUpload' ) {
            state = 'uploading';
        } else if ( type === 'stopUpload' ) {
            state = 'paused';
        } else if ( type === 'uploadFinished' ) {
            state = 'done';
        }
    });*/




var flag = true;
uploader.onFileQueued = function( file ) {
    $('#'+file.id).find('.cancel').on( 'click', function() {
        uploader.removeFile( file ,true);
    });
    $('#'+file.id).find('.stop').on( 'click', function() {
        if(flag){
          uploader.stop(file);
          $('#'+file.id).find('.stop').text('继续上传');
          flag = false;
      }else{
       uploader.upload(file);
       $('#'+file.id).find('.stop').text('暂停上传');
       flag = true;
   }
});
}


$btn.on( 'click', function() {
    uploader.upload();
    $('#thelist').find('.stop').text('暂停上传');
    flag = true;
});


$stopctlBtn.on( 'click', function() {
    uploader.stop(true); 
    $('#thelist').find('.stop').text('继续上传');
    flag = false;
});


function retry (file){
    $('#'file.id).find('.retry').on('click',function(){
        uploader.retry(file);
    })
}


    //负责view的销毁
    uploader.onFileDequeued = function( file ) {
      $( '#'+file.id ).off().find('.cancel').off().end().remove();
  };


  uploader.uploadComplete = function( file ){
    uploader.upload();
}


});


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值