import moment from "moment"; import store from "@/store"; let savaData = {}, checkData = {}, // 当前上传的节点文件和上一次提交进度 timer = null, // 网速定时器 bytesReceivedPerSecond = {}; // 时间节点上传文件总量 export function OSSclose() { if (timer) { clearInterval(timer); timer = null; store.state.trials.uploadTip = '0kb/s' } bytesReceivedPerSecond = {}; savaData = {}; checkData = {}; saveFinishedData(savaData); } export async function customerHttp(OSSclient, data, progressFn) { // 拿到上传到的file const uploadFile = data.file; // 拿到上传的size const uploadFileSize = uploadFile.size; // 这里拿到的单位是字节(uploadFileSize/ 1024 / 1024 // = 多少兆) // 设置每一片的大小,partSize 指定上传的每个分片的大小,范围为100 KB~5 GB。 // 分片标准为5MB,文件总大小大于5GB分片为20MB let partSize = 5 * 1024 * 1024; if (uploadFileSize < partSize) { partSize = uploadFileSize; } if (uploadFileSize > 5 * 1024 * 1024 * 1024) { partSize = 20 * 1024 * 1024; } // 设置所有的文件上传所有的唯一的saveFileId const saveFileId = `${uploadFileSize}_${data.path}`; if (data.speed) { setTimer(); } initPage(); let res = await multipartUpload(OSSclient, partSize, saveFileId, uploadFile, data, progressFn); return res; } async function multipartUpload(OSSclient, partSize, saveFileId, uploadFile, data, progressFn) { try { // object-name目前我是用的uploadFile.name,其实也是要根据你们的项目而定, // 有没有具体的规定, 要不要加项目名, 要不要加对应的环境; // 上传的参数 const uploadParams = { partSize, progress: (percentage, checkpoint) => { savaData[saveFileId] = checkpoint; if (!checkData[saveFileId]) { checkData[saveFileId] = 0 } if (data.speed) { let time = new Date().getTime(); let timeList = Object.keys(bytesReceivedPerSecond).sort((a, b) => a - b); let bytesTime = timeList.find(item => time - item < 1000); if (bytesTime) { bytesReceivedPerSecond[bytesTime] += data.file.size * percentage; } else { console.log("未查询到时间") if (timeList.length > 0) { bytesReceivedPerSecond[timeList[timeList.length - 1]] += data.file.size * percentage; } else { bytesReceivedPerSecond[time] = data.file.size * percentage; } } } savaData["lastSaveTime"] = new Date(); progressFn(percentage, data.file, checkData[saveFileId]) checkData[saveFileId] = percentage; if (percentage === 1) { delete checkData[saveFileId] } // 在上传过程中,把已经上传的数据存储下来 saveFinishedData(savaData); }, // headers: { // "Content-Disposition": `attachment; filename=hahaha.dcm`, // "Cache-Control": "public, no-cache" // } }; // 断点续传 await resumeUpload(uploadParams, saveFileId); const res = await OSSclient.multipartUpload( data.path, uploadFile, uploadParams ); if (res.res.status === 200) { // 重新去掉某个缓存进行设置 delete savaData[saveFileId]; saveFinishedData(savaData); } return res; } catch (e) { console.log(e); // 捕获超时异常。 if (e.code === "ConnectionTimeoutError") { console.log("TimeoutError"); // do ConnectionTimeoutError operation } return false; } } async function resumeUpload(uploadParams, saveFileId) { if (localStorage.getItem("upload-function-name")) { const obj = JSON.parse(localStorage.getItem("upload-function-name")); if (Object.keys(obj).includes(saveFileId)) { uploadParams.checkpoint = obj[saveFileId]; } } } // 存储到内存 function saveFinishedData(finishedData) { localStorage.setItem( "upload-function-name", JSON.stringify(finishedData) ); } function initPage() { // 判断是不是有缓存 const localData = localStorage.getItem("upload-function-name"); if (!localData) return; savaData = JSON.parse(localData); // 当前时间 > 存储时间(1000 * 60 * 60表示1h,意思就是这些数据你要存多久, // 可以是1h也可以是多少天,随意) if ( moment(new Date()).diff(moment(savaData.lastSaveTime)) > 1000 * 60 * 60 ) { localStorage.removeItem("upload-function-name"); } } function setTimer() { if (timer) return false; timer = setInterval(() => { let timeList = Object.keys(bytesReceivedPerSecond).sort((a, b) => a - b); if (timeList.length > 0) { let totalBytes = timeList.reduce((sum, bytes) => sum + bytesReceivedPerSecond[bytes], 0) / (5 * 1024); let unit = 'kb/s'; if (totalBytes > 1024) { totalBytes = totalBytes / 1024; unit = "mb/s"; } store.state.trials.uploadTip = totalBytes.toFixed(2) + unit; } if (timeList.length >= 5) { delete bytesReceivedPerSecond[timeList[0]] } let time = new Date().getTime(); bytesReceivedPerSecond[time] = 0; }, 1000) }