import md5, { arrayBuffer } from "js-md5"; //引入MD5加密 import { API } from "@/axios/api"; // 这里指前端调用接口的api方法 export const uploadByPieces = ({ randoms, file, pieceSize = 10, progress, dataId, success, error }) => { // 如果文件传入为空直接 return 返回 // if (!file || !file.length) return; console.log(file); let fileMD5 = ""; // 总文件列表 const chunkSize = pieceSize * 1024 * 1024; // 5MB一片 const chunkCount = Math.ceil(file.size / chunkSize); // 总片数 // 获取md5 const readFileMD5 = () => { // 读取视频文件的md5 // console.log("获取文件的MD5值"); let fileRederInstance = new FileReader(); console.log("file", file); fileRederInstance.readAsBinaryString(file); fileRederInstance.addEventListener("load", (e) => { let fileBolb = e.target.result; fileMD5 = md5(fileBolb); // console.log("fileMD5", fileMD5); // console.log("文件未被上传,将分片上传"); readChunkMD5(); }); }; const getChunkInfo = (file, currentChunk, chunkSize) => { let start = currentChunk * chunkSize; let end = Math.min(file.size, start + chunkSize); let chunk = file.slice(start, end); return { start, end, chunk }; }; // 针对每个文件进行chunk处理 const readChunkMD5 = () => { // 针对单个文件进行chunk上传 let arr = []; for (var i = 0; i < chunkCount; i++) { const { chunk } = getChunkInfo(file, i, chunkSize); console.log("总片数" + chunkCount); console.log("分片后的数据---测试:" + i); console.log(chunk); uploadChunk({ chunk, currentChunk: i, chunkCount, arr }); } }; const uploadChunk = (chunkInfo) => { // progressFun() let config = { headers: { "Content-Type": "multipart/form-data" } }; // 创建formData对象,下面是结合不同项目给后端传入的对象。 let fetchForm = new FormData(); fetchForm.append("identifier", randoms); fetchForm.append("chunkNumber", chunkInfo.currentChunk + 1); fetchForm.append("chunkSize", chunkSize); fetchForm.append("currentChunkSize", chunkInfo.chunk.size); fetchForm.append("file", chunkInfo.chunk); fetchForm.append("filename", file.name); fetchForm.append("totalChunks", chunkInfo.chunkCount); fetchForm.append("totalSize", chunkSize); fetchForm.append("dataId", dataId); // fetchForm.append('md5', fileMD5) API.fileUpload(fetchForm, config) .then((res) => { // console.log("分片上传返回信息:" + JSON.stringify(res)); // console.log(chunkInfo); chunkInfo.arr.push(chunkInfo.currentChunk); // console.log(chunkInfo.arr); if (res.code == 1) { // 结合不同项目 将成功的信息返回出去,这里可变的是指 res.data[0] if (chunkInfo.arr.length == chunkInfo.chunkCount) { success({ videoName: file.name }); } // 下面如果在项目中没有用到可以不用打开注释 console.log(chunkInfo); if (chunkInfo.currentChunk < chunkInfo.chunkCount - 1) { console.log("分片上传成功"); } else { // 当总数大于等于分片个数的时候 if (chunkInfo.currentChunk + 1 == chunkInfo.chunkCount) { console.log("文件开始------合并成功"); } } } else { console.log(res.message); error(); } }) .catch((e) => { error && error(e); }); }; readFileMD5(); // 开始执行代码 };