upload.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import md5 from 'js-md5' //引入MD5加密
  2. import { upload } from '@/api/upload.js' // 这里指前端调用接口的api方法
  3. import store from '@/store/index.js';
  4. import { TOKENNAME,HTTP_REQUEST_URL } from '@/config/app';
  5. export const uploadByPieces = ({ randoms, file, pieceSize = 2,pid, progress, success, error, uploading }) => {
  6. // 如果文件传入为空直接 return 返回
  7. if (!file) return
  8. let fileMD5 = ''// 总文件列表
  9. const chunkSize = pieceSize * 1024 * 1024 // 5MB一片
  10. const chunkCount = Math.ceil(file.size / chunkSize) // 总片数
  11. // 获取md5
  12. const readFileMD5 = () => {
  13. // 读取视频文件的md5
  14. let fileRederInstance = new FileReader()
  15. fileRederInstance.readAsBinaryString(file)
  16. fileRederInstance.addEventListener('load', e => {
  17. let fileBolb = e.target.result
  18. fileMD5 = md5(fileBolb)
  19. readChunkMD5()
  20. })
  21. }
  22. const getChunkInfo = (file, currentChunk, chunkSize) => {
  23. let start = currentChunk * chunkSize
  24. let end = Math.min(file.size, start + chunkSize)
  25. let chunk = file.slice(start, end)
  26. return { start, end, chunk }
  27. }
  28. // 针对每个文件进行chunk处理
  29. const readChunkMD5 = async () => {
  30. // 针对单个文件进行chunk上传
  31. for (var i = 0; i < chunkCount; i++) {
  32. const { chunk } = getChunkInfo(file, i, chunkSize)
  33. console.log("总片数" + chunkCount)
  34. console.log("分片后的数据---测试:" + i)
  35. await uploadChunk({ chunk, currentChunk: i, chunkCount })
  36. }
  37. }
  38. const uploadChunk = (chunkInfo) => {
  39. // progressFun()
  40. return new Promise((resolver, reject) => {
  41. let config = {
  42. headers: {
  43. 'Content-Type': 'multipart/form-data'
  44. }
  45. }
  46. // 创建formData对象,下面是结合不同项目给后端传入的对象。
  47. let fetchForm = new FormData()
  48. fetchForm.append('chunkNumber', chunkInfo.currentChunk + 1) // 第几片
  49. fetchForm.append('chunkSize', chunkSize) // 分片大小的限制 例如限制 5M
  50. fetchForm.append('currentChunkSize', chunkInfo.chunk.size) // 每一片的大小
  51. fetchForm.append('file', chunkInfo.chunk) //每一片的文件
  52. fetchForm.append('filename', file.name) // 文件名
  53. fetchForm.append('totalChunks', chunkInfo.chunkCount) //总片数
  54. fetchForm.append('md5', fileMD5)
  55. fetchForm.append('pid', pid) //附件视频上传分类
  56. uni.uploadFile({
  57. url:HTTP_REQUEST_URL+'/api/upload/video',
  58. file: chunkInfo.chunk,
  59. formData: {
  60. 'chunkNumber': chunkInfo.currentChunk + 1,
  61. 'chunkSize': chunkSize,
  62. 'currentChunkSize': chunkInfo.chunk.size,
  63. 'filename': file.name,
  64. 'totalChunks': chunkInfo.chunkCount,
  65. 'md5': fileMD5,
  66. 'pid':pid
  67. },
  68. header: {
  69. // #ifdef MP
  70. "Content-Type": "multipart/form-data",
  71. // #endif
  72. [TOKENNAME]: 'Bearer ' + store.state.app.token
  73. },
  74. success: function(res) {
  75. if (res.errMsg == 'uploadFile:ok') {
  76. success(res.data)
  77. resolver(true)
  78. }
  79. },
  80. fail: function(res) {
  81. console.log("上传失败:", res)
  82. }
  83. })
  84. })
  85. }
  86. readFileMD5() // 开始执行代码
  87. }