upload.js 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import md5 from 'js-md5'; //引入MD5加密
  2. import { upload } from '@/api/upload.js'; // 这里指前端调用接口的api方法
  3. export const uploadByPieces = ({ file, pieceSize = 2, success, error, uploading }) => {
  4. // 如果文件传入为空直接 return 返回
  5. if (!file) return;
  6. let fileMD5 = ''; // 总文件列表
  7. const chunkSize = pieceSize * 1024 * 1024; // 5MB一片
  8. const chunkCount = Math.ceil(file.size / chunkSize); // 总片数
  9. // 获取md5
  10. const readFileMD5 = () => {
  11. // 读取视频文件的md5
  12. console.log('获取文件的MD5值');
  13. let fileRederInstance = new FileReader();
  14. console.log('file', file);
  15. fileRederInstance.readAsBinaryString(file);
  16. fileRederInstance.addEventListener('load', (e) => {
  17. let fileBolb = e.target.result;
  18. fileMD5 = md5(fileBolb);
  19. console.log('fileMD5', fileMD5);
  20. console.log('文件未被上传,将分片上传');
  21. readChunkMD5();
  22. });
  23. };
  24. const getChunkInfo = (file, currentChunk, chunkSize) => {
  25. let start = currentChunk * chunkSize;
  26. let end = Math.min(file.size, start + chunkSize);
  27. let chunk = file.slice(start, end);
  28. return { start, end, chunk };
  29. };
  30. // 针对每个文件进行chunk处理
  31. const readChunkMD5 = async () => {
  32. // 针对单个文件进行chunk上传
  33. for (var i = 0; i < chunkCount; i++) {
  34. const { chunk } = getChunkInfo(file, i, chunkSize);
  35. console.log('总片数' + chunkCount);
  36. console.log('分片后的数据---测试:' + i);
  37. await uploadChunk({ chunk, currentChunk: i, chunkCount });
  38. }
  39. };
  40. const uploadChunk = (chunkInfo) => {
  41. // progressFun()
  42. return new Promise((resolver, reject) => {
  43. let config = {
  44. headers: {
  45. 'Content-Type': 'multipart/form-data',
  46. },
  47. };
  48. // 创建formData对象,下面是结合不同项目给后端传入的对象。
  49. let fetchForm = new FormData();
  50. fetchForm.append('chunkNumber', chunkInfo.currentChunk + 1); // 第几片
  51. fetchForm.append('chunkSize', chunkSize); // 分片大小的限制 例如限制 5M
  52. fetchForm.append('currentChunkSize', chunkInfo.chunk.size); // 每一片的大小
  53. fetchForm.append('file', chunkInfo.chunk); //每一片的文件
  54. fetchForm.append('filename', file.name); // 文件名
  55. fetchForm.append('totalChunks', chunkInfo.chunkCount); //总片数
  56. fetchForm.append('md5', fileMD5);
  57. upload(fetchForm, config)
  58. .then((res) => {
  59. console.log('分片上传返回信息:', res);
  60. if (res.data.code == 1) {
  61. // // 结合不同项目 将成功的信息返回出去
  62. // 下面如果在项目中没有用到可以不用打开注释
  63. uploading(chunkInfo.currentChunk + 1, chunkInfo.chunkCount);
  64. resolver(true);
  65. } else if (res.data.code == 2) {
  66. if (chunkInfo.currentChunk < chunkInfo.chunkCount - 1) {
  67. console.log('分片上传成功');
  68. } else {
  69. // 当总数大于等于分片个数的时候
  70. if (chunkInfo.currentChunk + 1 == chunkInfo.chunkCount) {
  71. console.log('文件开始------合并成功');
  72. success(res.data);
  73. }
  74. }
  75. }
  76. })
  77. .catch((e) => {
  78. error && error(e);
  79. });
  80. });
  81. };
  82. readFileMD5(); // 开始执行代码
  83. };