splitUpload.js 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. var splitUpload = (function(){
  2. /**
  3. * 分割上传其中一块
  4. * @param {[type]} file [文件Flie对象]
  5. * @param {[type]} totalSize [总大小]
  6. * @param {[type]} eachSize [每次大小]
  7. * @param {[type]} SucCallback [成功回调]
  8. * 回调参数
  9. * @param thunkTo [已上传大小]
  10. * @param totalSize [总大小]
  11. * @param {[type]} ErrCallback [失败回调]
  12. * 回调参数
  13. * @param res [ajax回调的response]
  14. * @param {[type]} count [上传的次数]
  15. * @param {[type]} counts [上传的总次数]
  16. * @param {[string]} uploadLink [上传链接] 默认
  17. */
  18. function loop(file, totalSize, eachSize, SucCallback, ErrCallback, count, counts, uploadLink){
  19. var thunkFrom = count * eachSize;// 切割起始端
  20. var thunkTo = (count + 1) * eachSize > totalSize ? totalSize : (count + 1) * eachSize;// 切割末端
  21. fd = new FormData();
  22. fd.append('theFile', file.slice(thunkFrom, thunkTo)); // 分好段的文件
  23. fd.append('fileName', file.name); // 文件名
  24. fd.append('totalSize', totalSize); // 大小
  25. fd.append('isFirstChunk', count === 0); // 是否第一次上传
  26. fd.append('isLastChunk', count === counts - 1); // 是否最后一次上传
  27. var xhr = new XMLHttpRequest();
  28. xhr.open("post", uploadLink, true);
  29. xhr.onreadystatechange = function () {
  30. if(xhr.readyState==4 && xhr.status==200){
  31. var rs = JSON.parse(xhr.responseText);
  32. if(rs.status == 200){
  33. SucCallback(thunkTo, totalSize)
  34. // isLastChunk
  35. if(count === counts - 1){
  36. return;
  37. }
  38. // 继续上传
  39. loop(file, totalSize, eachSize, SucCallback, ErrCallback, ++count, counts, uploadLink)
  40. }else{
  41. ErrCallback(rs)
  42. }
  43. }
  44. };
  45. xhr.send(fd);
  46. }
  47. /**
  48. * 分割上传
  49. * @param {[type]} file [文件Flie对象]
  50. * @param {[function]} SucCallback [成功回调]
  51. * @param {[function]} ErrCallback [失败回调]
  52. * @param {[string]} uploadLink [上传链接] default
  53. */
  54. return function(file, SucCallback, ErrCallback, uploadLink) {
  55. uploadLink = uploadLink || '/upload';
  56. var totalSize = file.size; // 总大小
  57. var eachSize = 1024 * 1000; // 每次上传大小 这里是100kb
  58. var counts = Math.ceil(totalSize / eachSize); // 上传的总次数
  59. loop(file, totalSize, eachSize, SucCallback, ErrCallback, 0, counts, uploadLink)
  60. //test
  61. /*size > 1024
  62. ? size / 1024 > 1024
  63. ? size / (1024 * 1024) > 1024
  64. ? (size / (1024 * 1024 * 1024)).toFixed(2) + 'GB'
  65. : (size / (1024 * 1024)).toFixed(2) + 'MB'
  66. : (size / 1024).toFixed(2) + 'KB'
  67. : (size).toFixed(2) + 'B';*/
  68. })();