分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 网页技术

webUploader大文件断点续传学习心得 ?多文件

发布时间:2023-09-06 01:35责任编辑:郭大石关键词:暂无标签

二、Jsp代码:

[javascript]view plaincopy
  1. <!--断点续传start-->
  2. <!--隐藏域实时保存上传进度-->
  3. <inputtype="hidden"/>
  4. <div>
  5. <labelstyle="font-weight:100;float:left;margin-left:15px;width:144px;margin-right:15px;">大文件:</label>
  6. <div>
  7. <div>
  8. <div>选择文件</div>
  9. <divstyle="position:absolute;top:0px;left:0px;width:88px;height:35px;overflow:hidden;bottom:auto;right:auto;">
  10. <inputname="file"type="file"/>
  11. <labelstyle="opacity:0;width:100%;height:100%;display:block;cursor:pointer;background:rgb(255,255,255)nonerepeatscroll0%0%;"></label>
  12. </div>
  13. </div>
  14. <!--文件列表:选择文件后在该div显示-->
  15. <divstyle="margin-left:160px;"></div>
  16. <labelstyle="font-weight:100;float:left;margin-left:15px;width:144px;margin-right:15px;"></label>
  17. <buttonstyle="padding:7px50px;">开始上传</button>
  18. </div>
  19. </div>
  20. <!--断点续传end-->


三、js代码

[javascript]view plaincopy
  1. <scripttype="text/javascript">
  2. jQuery(function(){
  3. /*******************初始化参数*********************************/
  4. var$list=$(‘#thelist‘),//文件列表
  5. $btn=$(‘#startOrStopBtn‘),//开始上传按钮
  6. state=‘pending‘,//初始按钮状态
  7. uploader;//uploader对象
  8. varfileMd5;//文件唯一标识
  9. /******************下面的参数是自定义的*************************/
  10. varfileName;//文件名称
  11. varoldJindu;//如果该文件之前上传过已经上传的进度是多少
  12. varcount=0;//当前正在上传的文件在数组中的下标,一次上传多个文件时使用
  13. varfilesArr=newArray();//文件数组:每当有文件被添加进队列的时候就push到数组中
  14. varmap={};//key存储文件id,value存储该文件上传过的进度
  15. /*****************************************************监听分块上传过程中的三个时间点start***********************************************************/
  16. WebUploader.Uploader.register({
  17. "before-send-file":"beforeSendFile",//整个文件上传前
  18. "before-send":"beforeSend",//每个分片上传前
  19. "after-send-file":"afterSendFile",//分片上传完毕
  20. },
  21. {
  22. //时间点1:所有分块进行上传之前调用此函数
  23. beforeSendFile:function(file){
  24. vardeferred=WebUploader.Deferred();
  25. //1、计算文件的唯一标记fileMd5,用于断点续传如果.md5File(file)方法里只写一个file参数则计算MD5值会很慢所以加了后面的参数:10*1024*1024
  26. (newWebUploader.Uploader()).md5File(file,0,10*1024*1024).progress(function(percentage){
  27. $(‘#‘+file.id).find(‘p.state‘).text(‘正在读取文件信息...‘);
  28. })
  29. .then(function(val){
  30. $(‘#‘+file.id).find("p.state").text("成功获取文件信息...");
  31. fileMd5=val;
  32. //获取文件信息后进入下一步
  33. deferred.resolve();
  34. });
  35. fileName=file.name;//为自定义参数文件名赋值
  36. returndeferred.promise();
  37. },
  38. //时间点2:如果有分块上传,则每个分块上传之前调用此函数
  39. beforeSend:function(block){
  40. vardeferred=WebUploader.Deferred();
  41. $.ajax({
  42. type:"POST",
  43. url:"${ctx}/testController/mergeOrCheckChunks.do?param=checkChunk",//ajax验证每一个分片
  44. data:{
  45. fileName:fileName,
  46. jindutiao:$("#jindutiao").val(),
  47. fileMd5:fileMd5,//文件唯一标记
  48. chunk:block.chunk,//当前分块下标
  49. chunkSize:block.end-block.start//当前分块大小
  50. },
  51. cache:false,
  52. async:false,//与js同步
  53. timeout:1000,//todo超时的话,只能认为该分片未上传过
  54. dataType:"json",
  55. success:function(response){
  56. if(response.ifExist){
  57. //分块存在,跳过
  58. deferred.reject();
  59. }else{
  60. //分块不存在或不完整,重新发送该分块内容
  61. deferred.resolve();
  62. }
  63. }
  64. });
  65. this.owner.options.formData.fileMd5=fileMd5;
  66. deferred.resolve();
  67. returndeferred.promise();
  68. },
  69. //时间点3:所有分块上传成功后调用此函数
  70. afterSendFile:function(){
  71. //如果分块上传成功,则通知后台合并分块
  72. $.ajax({
  73. type:"POST",
  74. url:"${ctx}/testController/mergeOrCheckChunks.do?param=mergeChunks",//ajax将所有片段合并成整体
  75. data:{
  76. fileName:fileName,
  77. fileMd5:fileMd5,
  78. },
  79. success:function(data){
  80. count++;//每上传完成一个文件count+1
  81. if(count<=filesArr.length-1){
  82. uploader.upload(filesArr[count].id);//上传文件列表中的下一个文件
  83. }
  84. //合并成功之后的操作
  85. }
  86. });
  87. }
  88. });
  89. /*****************************************************监听分块上传过程中的三个时间点end**************************************************************/
  90. /************************************************************初始化WebUploaderstart******************************************************************/
  91. uploader=WebUploader.create({
  92. auto:false,//选择文件后是否自动上传
  93. chunked:true,//开启分片上传
  94. chunkSize:10*1024*1024,//如果要分片,分多大一片?默认大小为5M
  95. chunkRetry:3,//如果某个分片由于网络问题出错,允许自动重传多少次
  96. threads:3,//上传并发数。允许同时最大上传进程数[默认值:3]
  97. duplicate:false,//是否重复上传(同时选择多个一样的文件),true可以重复上传
  98. prepareNextFile:true,//上传当前分片时预处理下一分片
  99. swf:‘${ctx}/resource/webuploader/Uploader.swf‘,//swf文件路径
  100. server:‘${ctx}/testController/fileSave.do‘,//文件接收服务端
  101. fileSizeLimit:6*1024*1024*1024,//6G验证文件总大小是否超出限制,超出则不允许加入队列
  102. fileSingleSizeLimit:3*1024*1024*1024,//3G验证单个文件大小是否超出限制,超出则不允许加入队列
  103. pick:{
  104. id:‘#picker‘,//这个id是你要点击上传文件按钮的外层div的id
  105. multiple:false//是否可以批量上传,true可以同时选择多个文件
  106. },
  107. resize:false,//不压缩image,默认如果是jpeg,文件上传前会先压缩再上传!
  108. accept:{
  109. //允许上传的文件后缀,不带点,多个用逗号分割
  110. extensions:"txt,jpg,jpeg,bmp,png,zip,rar,war,pdf,cebx,doc,docx,ppt,pptx,xls,xlsx",
  111. mimeTypes:‘.txt,.jpg,.jpeg,.bmp,.png,.zip,.rar,.war,.pdf,.cebx,.doc,.docx,.ppt,.pptx,.xls,.xlsx‘,
  112. }
  113. });
  114. /************************************************************初始化WebUploaderend********************************************************************/
  115. //当有文件被添加进队列的时候(点击上传文件按钮,弹出文件选择框,选择完文件点击确定后触发的事件)
  116. uploader.on(‘fileQueued‘,function(file){
  117. //限制单个文件的大小超出了提示
  118. if(file.size>3*1024*1024*1024){
  119. alert("单个文件大小不能超过3G");
  120. returnfalse;
  121. }
  122. /*************如果一次只能选择一个文件,再次选择替换前一个,就增加如下代码*******************************/
  123. //清空文件队列
  124. $list.html("");
  125. //清空文件数组
  126. filesArr=[];
  127. /*************如果一次只能选择一个文件,再次选择替换前一个,就增加以上代码*******************************/
  128. //将选择的文件添加进文件数组
  129. filesArr.push(file);
  130. $.ajax({
  131. type:"POST",
  132. url:"${ctx}/testController/selectProgressByFileName.do",//先检查该文件是否上传过,如果上传过,上传进度是多少
  133. data:{
  134. fileName:file.name//文件名
  135. },
  136. cache:false,
  137. async:false,//同步
  138. dataType:"json",
  139. success:function(data){
  140. //上传过
  141. if(data>0){
  142. //上传过的进度的百分比
  143. oldJindu=data/100;
  144. //如果上传过上传了多少
  145. varjindutiaoStyle="width:"+data+"%";
  146. $list.append(‘<div>‘+
  147. ‘<h4>‘+file.name+‘</h4>‘+
  148. ‘<p>已上传‘+data+‘%</p>‘+
  149. ‘<ahref="javascript:void(0);">删除</a>‘+
  150. ‘<div>‘+
  151. ‘<divrole="progressbar"style="‘+jindutiaoStyle+‘">‘+
  152. ‘</div>‘+
  153. ‘</div>‘+
  154. ‘</div>‘);
  155. //将上传过的进度存入map集合
  156. map[file.id]=oldJindu;
  157. }else{//没有上传过
  158. $list.append(‘<div>‘+
  159. ‘<h4>‘+file.name+‘</h4>‘+
  160. ‘<p>等待上传...</p>‘+
  161. ‘<ahref="javascript:void(0);">删除</a>‘+
  162. ‘</div>‘);
  163. }
  164. }
  165. });
  166. uploader.stop(true);
  167. //删除队列中的文件
  168. $(".btnRemoveFile").bind("click",function(){
  169. varfileItem=$(this).parent();
  170. uploader.removeFile($(fileItem).attr("id"),true);
  171. $(fileItem).fadeOut(function(){
  172. $(fileItem).remove();
  173. });
  174. //数组中的文件也要删除
  175. for(vari=0;i<filesArr.length;i++){
  176. if(filesArr[i].id==$(fileItem).attr("id")){
  177. filesArr.splice(i,1);//i是要删除的元素在数组中的下标,1代表从下标位置开始连续删除一个元素
  178. }
  179. }
  180. });
  181. });
  182. //文件上传过程中创建进度条实时显示
  183. uploader.on(‘uploadProgress‘,function(file,percentage){
  184. var$li=$(‘#‘+file.id),
  185. $percent=$li.find(‘.progress.progress-bar‘);
  186. //避免重复创建
  187. if(!$percent.length){
  188. $percent=$(‘<div>‘+
  189. ‘<divrole="progressbar"style="width:0%">‘+
  190. ‘</div>‘+
  191. ‘</div>‘).appendTo($li).find(‘.progress-bar‘);
  192. }
  193. //将实时进度存入隐藏域
  194. $("#jindutiao").val(Math.round(percentage*100));
  195. //根据fielId获得当前要上传的文件的进度
  196. varoldJinduValue=map[file.id];
  197. if(percentage<oldJinduValue&&oldJinduValue!=1){
  198. $li.find(‘p.state‘).text(‘上传中‘+Math.round(oldJinduValue*100)+‘%‘);
  199. $percent.css(‘width‘,oldJinduValue*100+‘%‘);
  200. }else{
  201. $li.find(‘p.state‘).text(‘上传中‘+Math.round(percentage*10
我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved