upload.html 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. <br/>
  10. </body>
  11. <script src="http://libs.baidu.com/jquery/1.8.3/jquery.min.js"></script>
  12. <script type="text/javascript">
  13. $("#slice").change(function(event) {
  14. var file = $("#slice")[0].files[0];
  15. PostFile(file,0);
  16. });
  17. //执行分片上传
  18. function PostFile(file,i, uuid){
  19. var name = file.name, //文件名
  20. size = file.size, //总大小
  21. shardSize = 10 * 1024 * 1024, //以10MB为一个分片,每个分片的大小
  22. shardCount = Math.ceil(size / shardSize); //总片数
  23. if(i >= shardCount){
  24. return;
  25. }
  26. //判断uuid是否存在
  27. if (uuid === null || uuid === undefined) {
  28. uuid = guid();
  29. }
  30. //console.log(size,i+1,shardSize); //文件总大小,第一次,分片大小//
  31. var start = i * shardSize;
  32. var end = start + shardSize;
  33. var packet = file.slice(start, end); //将文件进行切片
  34. /* 构建form表单进行提交 */
  35. var form = new FormData();
  36. form.append("uuid", uuid);// 前端生成uuid作为标识符传个后台每个文件都是一个uuid防止文件串了
  37. form.append("data", packet); //slice方法用于切出文件的一部分
  38. form.append("name", name);
  39. form.append("totalSize", size);
  40. form.append("total", shardCount); //总片数
  41. form.append("index", i + 1); //当前是第几片
  42. $.ajax({
  43. url: "http://127.0.0.1:9097/index/doPost",
  44. type: "POST",
  45. data: form,
  46. //timeout:"10000", //超时10秒
  47. async: true, //异步
  48. dataType:"json",
  49. processData: false, //很重要,告诉jquery不要对form进行处理
  50. contentType: false, //很重要,指定为false才能形成正确的Content-Type
  51. success: function (msg) {
  52. console.log(msg);
  53. /* 表示上一块文件上传成功,继续下一次 */
  54. if (msg.status === 201) {
  55. form = '';
  56. i++;
  57. PostFile(file, i, uuid);
  58. } else if (msg.status === 502) {
  59. form = '';
  60. /* 失败后,每2秒继续传一次分片文件 */
  61. setInterval(function () { PostFile(file, i, uuid) }, 2000);
  62. } else if (msg.status === 200) {
  63. merge(uuid, name)
  64. console.log("上传成功");
  65. } else if (msg.status === 500) {
  66. console.log('第'+msg.i+'次,上传文件有误!');
  67. } else {
  68. console.log('未知错误');
  69. }
  70. }
  71. })
  72. }
  73. function merge(uuid, fileName) {
  74. $.ajax({
  75. url: "http://127.0.0.1:9097/index/merge",
  76. type: "GET",
  77. data: {uuid: uuid, newFileName: fileName},
  78. //timeout:"10000", //超时10秒
  79. async: true, //异步
  80. dataType:"json",
  81. success: function (msg) {
  82. console.log(msg);
  83. }
  84. })
  85. }
  86. //生成uuid
  87. function guid() {
  88. return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
  89. var r = Math.random() * 16 | 0,
  90. v = c === 'x' ? r : (r & 0x3 | 0x8);
  91. return v.toString(16);
  92. });
  93. }
  94. </script>
  95. </html>