经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » jQuery » 查看文章
ajax异步实现文件分片上传
来源:cnblogs  作者:林恒  时间:2020/11/9 16:02:19  对本文有异议
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>JS分片上传-极速上传</title>
  6. </head>
  7. <body>
  8. <input type="file" name="slice" id="slice" >
  9. <div id="output"><!-- 信息存放地 --> </div>
  10. <br/>
  11. </body>
  12. <script src="http://libs.baidu.com/jquery/1.8.3/jquery.min.js"></script>
  13.  
  14. <script type="text/javascript">
  15. $("#slice").change(function(event) {
  16. var file = $("#slice")[0].files[0];
  17. var name = file.name;
  18. //进行初始化
  19. $.ajax({
  20. type:"POST", //请求方式
  21. url:"http://localhost:8080/getuploadId",
  22. async: false,
  23. dataType:"json", //返回数据类型
  24. data:{//请求参数
  25. fileName:name,
  26. },
  27. success:function(data){ //请求成功后
  28. console.log("data.code="+JSON.stringify(data));
  29. console.log("data.data.objectName="+data.data.objectName);
  30. console.log("data.data.uploadId="+data.data.uploadId);
  31. var objectName=data.data.objectName;
  32. var uploadId=data.data.uploadId;
  33. //成功后执行分段上传
  34. PostFile(file,0,objectName,uploadId);
  35. //合并
  36. combineFile(objectName,uploadId);
  37. },
  38. error:function (){
  39. alert("系统出现异常!");
  40. flag=false;
  41. }
  42. });
  43. });
  44. //执行分片上传
  45. function PostFile(file,i,objectName,uploadId){
  46. var name = file.name, //文件名
  47. size = file.size, //总大小shardSize = 2 * 1024 * 1024,
  48. shardSize = 1 * 1024 * 1024, //以2MB为一个分片,每个分片的大小
  49. shardCount = Math.ceil(size / shardSize); //总片数
  50. if(i >= shardCount){
  51. return;
  52. }
  53. //console.log(size,i+1,shardSize); //文件总大小,第一次,分片大小//
  54. var start = i * shardSize;
  55. var end = start + shardSize;
  56. var packet = file.slice(start, end); //将文件进行切片
  57. // 分段号
  58. var partNumber = i + 1;
  59. /* 构建form表单进行提交 */
  60. var form = new FormData();
  61. form.append("fileId", '001')
  62. form.append("data", packet); //slice方法用于切出文件的一部分
  63. // form.append("lastModified", file.lastModified); //最后的额修改时间
  64. form.append("name", name);
  65. form.append("totalSize", size);
  66. form.append("uploadId", uploadId);
  67. form.append("objectName", objectName);
  68. form.append("mainFile", packet);
  69. form.append("total", shardCount);
  70. form.append("sortNumber", partNumber);
  71. //uploadId:uploadId,
  72. //objectName:objectName,
  73. //mainFile:blob,
  74. //total:partCount,
  75. //sortNumber:partNumber
  76. if(shardCount === i+1){
  77. shardSize = size - i * shardSize
  78. }
  79. form.append("shardSize", shardSize);
  80. form.append("total", shardCount); //总片数
  81. form.append("index", i + 1); //当前是第几片
  82. $.ajax({
  83. // header: {
  84. // web_token: "cpBvqWrr0UK9zPJoKj+412alxxcY6qFwrSVoO0juZg0S1jX/sGfMd9oi3AsSxW+MdWFrwtGCykUTmMqrqpbCElmT75DfB87lENC7lCuMxgF0d5wQB6yAubUVyGOzhbrScvIfD8ZSjOJ3D88AOy2xRd4oG8TxeGoMoZqnqIwjKg="
  85. // },
  86. url: "http://localhost:8080/multipartupload",
  87. type: "POST",
  88. data: form,
  89. //timeout:"10000", //超时10秒
  90. async: false, //同步
  91. dataType:"json",
  92. processData: false, //很重要,告诉jquery不要对form进行处理
  93. contentType: false, //很重要,指定为false才能形成正确的Content-Type
  94. success: function (data) {
  95. console.log("data="+JSON.stringify(data));
  96. /* 表示上一块文件上传成功,继续下一次 */
  97. if (data.data.code == 1) {
  98. form = '';
  99. i++;
  100. PostFile(file, i,objectName,uploadId);
  101. } else if (data.data.code == 502) {
  102. form = '';
  103. /* 失败后,每2秒继续传一次分片文件 */
  104. setInterval(function () { PostFile(file, i,objectName,uploadId) }, 2000);
  105. } else if (data.data.code == 200) {
  106. console.log("上传成功");
  107. } else if (data.data.code == 500) {
  108. console.log('第'+msg.i+'次,上传文件有误!');
  109. } else {
  110. console.log('未知错误');
  111. }
  112. }
  113. })
  114. }
  115. //合并
  116. function combineFile(objectName,uploadId){
  117. console.log("objectName="+objectName);
  118. console.log("uploadId="+uploadId);
  119. var object=new Object();
  120. object.objectName=objectName;
  121. object.uploadId=uploadId;
  122. $.ajax({
  123. headers: {
  124. Accept: "application/json; charset=utf-8"
  125. },
  126. type:"POST", //请求方式
  127. url:"http://localhost:8080/combine",
  128. async: false,
  129. contentType:"application/json",
  130. dataType:"json", //返回数据类型
  131. data:JSON.stringify(object),
  132. success:function(data){ //请求成功后
  133. console.log("data="+JSON.stringify(data));
  134. console.log("data.data.code="+data.data.code);
  135. console.log("data.data.url="+data.data.url);
  136. },
  137. error:function (){
  138. alert("系统出现异常!");
  139. flag=false;
  140. }
  141. });
  142. }
  143. </script>
  144. </html>

转载于:https://blog.csdn.net/likun1239656678/article/details/109432560?utm_medium=distribute.pc_category.none-task-blog-hot-13.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-13.nonecase

原文链接:http://www.cnblogs.com/smileZAZ/p/13915543.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号