二、Jsp代码:
[javascript]view plaincopy
- <!--断点续传start-->
- <!--隐藏域实时保存上传进度-->
- <inputtype="hidden"/>
- <div>
- <labelstyle="font-weight:100;float:left;margin-left:15px;width:144px;margin-right:15px;">大文件:</label>
- <div>
- <div>
- <div>选择文件</div>
- <divstyle="position:absolute;top:0px;left:0px;width:88px;height:35px;overflow:hidden;bottom:auto;right:auto;">
- <inputname="file"type="file"/>
- <labelstyle="opacity:0;width:100%;height:100%;display:block;cursor:pointer;background:rgb(255,255,255)nonerepeatscroll0%0%;"></label>
- </div>
- </div>
- <!--文件列表:选择文件后在该div显示-->
- <divstyle="margin-left:160px;"></div>
- <labelstyle="font-weight:100;float:left;margin-left:15px;width:144px;margin-right:15px;"></label>
- <buttonstyle="padding:7px50px;">开始上传</button>
- </div>
- </div>
- <!--断点续传end-->
三、js代码
[javascript]view plaincopy
- <scripttype="text/javascript">
- jQuery(function(){
- /*******************初始化参数*********************************/
- var$list=$(‘#thelist‘),//文件列表
- $btn=$(‘#startOrStopBtn‘),//开始上传按钮
- state=‘pending‘,//初始按钮状态
- uploader;//uploader对象
- varfileMd5;//文件唯一标识
- /******************下面的参数是自定义的*************************/
- varfileName;//文件名称
- varoldJindu;//如果该文件之前上传过已经上传的进度是多少
- varcount=0;//当前正在上传的文件在数组中的下标,一次上传多个文件时使用
- varfilesArr=newArray();//文件数组:每当有文件被添加进队列的时候就push到数组中
- varmap={};//key存储文件id,value存储该文件上传过的进度
- /*****************************************************监听分块上传过程中的三个时间点start***********************************************************/
- WebUploader.Uploader.register({
- "before-send-file":"beforeSendFile",//整个文件上传前
- "before-send":"beforeSend",//每个分片上传前
- "after-send-file":"afterSendFile",//分片上传完毕
- },
- {
- //时间点1:所有分块进行上传之前调用此函数
- beforeSendFile:function(file){
- vardeferred=WebUploader.Deferred();
- //1、计算文件的唯一标记fileMd5,用于断点续传如果.md5File(file)方法里只写一个file参数则计算MD5值会很慢所以加了后面的参数:10*1024*1024
- (newWebUploader.Uploader()).md5File(file,0,10*1024*1024).progress(function(percentage){
- $(‘#‘+file.id).find(‘p.state‘).text(‘正在读取文件信息...‘);
- })
- .then(function(val){
- $(‘#‘+file.id).find("p.state").text("成功获取文件信息...");
- fileMd5=val;
- //获取文件信息后进入下一步
- deferred.resolve();
- });
- fileName=file.name;//为自定义参数文件名赋值
- returndeferred.promise();
- },
- //时间点2:如果有分块上传,则每个分块上传之前调用此函数
- beforeSend:function(block){
- vardeferred=WebUploader.Deferred();
- $.ajax({
- type:"POST",
- url:"${ctx}/testController/mergeOrCheckChunks.do?param=checkChunk",//ajax验证每一个分片
- data:{
- fileName:fileName,
- jindutiao:$("#jindutiao").val(),
- fileMd5:fileMd5,//文件唯一标记
- chunk:block.chunk,//当前分块下标
- chunkSize:block.end-block.start//当前分块大小
- },
- cache:false,
- async:false,//与js同步
- timeout:1000,//todo超时的话,只能认为该分片未上传过
- dataType:"json",
- success:function(response){
- if(response.ifExist){
- //分块存在,跳过
- deferred.reject();
- }else{
- //分块不存在或不完整,重新发送该分块内容
- deferred.resolve();
- }
- }
- });
- this.owner.options.formData.fileMd5=fileMd5;
- deferred.resolve();
- returndeferred.promise();
- },
- //时间点3:所有分块上传成功后调用此函数
- afterSendFile:function(){
- //如果分块上传成功,则通知后台合并分块
- $.ajax({
- type:"POST",
- url:"${ctx}/testController/mergeOrCheckChunks.do?param=mergeChunks",//ajax将所有片段合并成整体
- data:{
- fileName:fileName,
- fileMd5:fileMd5,
- },
- success:function(data){
- count++;//每上传完成一个文件count+1
- if(count<=filesArr.length-1){
- uploader.upload(filesArr[count].id);//上传文件列表中的下一个文件
- }
- //合并成功之后的操作
- }
- });
- }
- });
- /*****************************************************监听分块上传过程中的三个时间点end**************************************************************/
- /************************************************************初始化WebUploaderstart******************************************************************/
- uploader=WebUploader.create({
- auto:false,//选择文件后是否自动上传
- chunked:true,//开启分片上传
- chunkSize:10*1024*1024,//如果要分片,分多大一片?默认大小为5M
- chunkRetry:3,//如果某个分片由于网络问题出错,允许自动重传多少次
- threads:3,//上传并发数。允许同时最大上传进程数[默认值:3]
- duplicate:false,//是否重复上传(同时选择多个一样的文件),true可以重复上传
- prepareNextFile:true,//上传当前分片时预处理下一分片
- swf:‘${ctx}/resource/webuploader/Uploader.swf‘,//swf文件路径
- server:‘${ctx}/testController/fileSave.do‘,//文件接收服务端
- fileSizeLimit:6*1024*1024*1024,//6G验证文件总大小是否超出限制,超出则不允许加入队列
- fileSingleSizeLimit:3*1024*1024*1024,//3G验证单个文件大小是否超出限制,超出则不允许加入队列
- pick:{
- id:‘#picker‘,//这个id是你要点击上传文件按钮的外层div的id
- multiple:false//是否可以批量上传,true可以同时选择多个文件
- },
- resize:false,//不压缩image,默认如果是jpeg,文件上传前会先压缩再上传!
- accept:{
- //允许上传的文件后缀,不带点,多个用逗号分割
- extensions:"txt,jpg,jpeg,bmp,png,zip,rar,war,pdf,cebx,doc,docx,ppt,pptx,xls,xlsx",
- mimeTypes:‘.txt,.jpg,.jpeg,.bmp,.png,.zip,.rar,.war,.pdf,.cebx,.doc,.docx,.ppt,.pptx,.xls,.xlsx‘,
- }
- });
- /************************************************************初始化WebUploaderend********************************************************************/
- //当有文件被添加进队列的时候(点击上传文件按钮,弹出文件选择框,选择完文件点击确定后触发的事件)
- uploader.on(‘fileQueued‘,function(file){
- //限制单个文件的大小超出了提示
- if(file.size>3*1024*1024*1024){
- alert("单个文件大小不能超过3G");
- returnfalse;
- }
- /*************如果一次只能选择一个文件,再次选择替换前一个,就增加如下代码*******************************/
- //清空文件队列
- $list.html("");
- //清空文件数组
- filesArr=[];
- /*************如果一次只能选择一个文件,再次选择替换前一个,就增加以上代码*******************************/
- //将选择的文件添加进文件数组
- filesArr.push(file);
- $.ajax({
- type:"POST",
- url:"${ctx}/testController/selectProgressByFileName.do",//先检查该文件是否上传过,如果上传过,上传进度是多少
- data:{
- fileName:file.name//文件名
- },
- cache:false,
- async:false,//同步
- dataType:"json",
- success:function(data){
- //上传过
- if(data>0){
- //上传过的进度的百分比
- oldJindu=data/100;
- //如果上传过上传了多少
- varjindutiaoStyle="width:"+data+"%";
- $list.append(‘<div>‘+
- ‘<h4>‘+file.name+‘</h4>‘+
- ‘<p>已上传‘+data+‘%</p>‘+
- ‘<ahref="javascript:void(0);">删除</a>‘+
- ‘<div>‘+
- ‘<divrole="progressbar"style="‘+jindutiaoStyle+‘">‘+
- ‘</div>‘+
- ‘</div>‘+
- ‘</div>‘);
- //将上传过的进度存入map集合
- map[file.id]=oldJindu;
- }else{//没有上传过
- $list.append(‘<div>‘+
- ‘<h4>‘+file.name+‘</h4>‘+
- ‘<p>等待上传...</p>‘+
- ‘<ahref="javascript:void(0);">删除</a>‘+
- ‘</div>‘);
- }
- }
- });
- uploader.stop(true);
- //删除队列中的文件
- $(".btnRemoveFile").bind("click",function(){
- varfileItem=$(this).parent();
- uploader.removeFile($(fileItem).attr("id"),true);
- $(fileItem).fadeOut(function(){
- $(fileItem).remove();
- });
- //数组中的文件也要删除
- for(vari=0;i<filesArr.length;i++){
- if(filesArr[i].id==$(fileItem).attr("id")){
- filesArr.splice(i,1);//i是要删除的元素在数组中的下标,1代表从下标位置开始连续删除一个元素
- }
- }
- });
- });
- //文件上传过程中创建进度条实时显示
- uploader.on(‘uploadProgress‘,function(file,percentage){
- var$li=$(‘#‘+file.id),
- $percent=$li.find(‘.progress.progress-bar‘);
- //避免重复创建
- if(!$percent.length){
- $percent=$(‘<div>‘+
- ‘<divrole="progressbar"style="width:0%">‘+
- ‘</div>‘+
- ‘</div>‘).appendTo($li).find(‘.progress-bar‘);
- }
- //将实时进度存入隐藏域
- $("#jindutiao").val(Math.round(percentage*100));
- //根据fielId获得当前要上传的文件的进度
- varoldJinduValue=map[file.id];
- if(percentage<oldJinduValue&&oldJinduValue!=1){
- $li.find(‘p.state‘).text(‘上传中‘+Math.round(oldJinduValue*100)+‘%‘);
- $percent.css(‘width‘,oldJinduValue*100+‘%‘);
- }else{
- $li.find(‘p.state‘).text(‘上传中‘+Math.round(percentage*10
知识推荐
- HTML 转义字符列表
- jQuery-niceScroll滚动条错位问题
- http远程登录防火墙
- Apache2 实现https访问http服务
- (转) 用户访问网站基本流程及原理(史上最全,没有之一)
- apache配置
- web前端性能优化
- PHP高效率写法(详解原因)
- NFS(expirtfs命令,NFS客户端创建新文件所属组和所属主都为nobody)
- vue.js - 基本配置
- JS-第一节课程
- 原生JS forEach()和map()遍历,jQuery$.each()和$.map()遍历
- CSS3 动画及过渡详解
- 【思库教育】2017PHP项目实战基础+进阶+项目之基础篇
- ECharts ?环形饼图 动态获取json数据
- js基础
- php自定义函数: 时间转换成智能形式
- .Net Core扩展 SharpPlugs简单上手