From 31ab2edfa500364818d2cc2c30acc1f4ae5b8dac Mon Sep 17 00:00:00 2001 From: zhouwx <1175765986@qq.com> Date: 星期二, 20 八月 2024 17:25:30 +0800 Subject: [PATCH] bug修改 --- src/views/components/upload.vue | 1014 ++++++++++++++++++++++++++++------------------------------ 1 files changed, 488 insertions(+), 526 deletions(-) diff --git a/src/views/components/upload.vue b/src/views/components/upload.vue index 036dc1a..e53ddca 100644 --- a/src/views/components/upload.vue +++ b/src/views/components/upload.vue @@ -1,533 +1,495 @@ <template> - <div class="greetings" v-loading="loading"> - <el-upload accept=".mp4, .mp3, .xls, .xlsx, .doc, .docx, .ppt, .pptx, .pdf" :on-change="handleFileChange" :on-preview="view" :auto-upload="false" ref="uploadfileComponent" :limit="1" :on-exceed="handleExceed" v-model:file-list="fileList"> - <template #trigger> - <el-button type="primary">选择文件</el-button> - </template> - <el-button :disabled="uploadDisabled" style="margin-left: 10px" type="success" @click="handlerUpload">上传</el-button> - <el-button class="ml-3" type="success" @click="resetData" >重置</el-button> - <template #tip> - <br /><br /> - <span>上传进度:{{ fakeUploadPercentage }}%</span> - <el-progress :text-inside="true" :stroke-width="26" :percentage="fakeUploadPercentage" /> - <div class="el-upload__tip text-red">限制一个文件, 新文件将会覆盖原文件</div> - </template> - </el-upload> - <br> - <div v-if="container.showVideo" style="width: 300px;height: 200px"> - <video ref="videoPlayer" class="video-js" style="margin: auto auto"></video> - </div> +<!-- <div class="greetings" v-loading="loading">--> +<!-- <el-upload accept=".mp4, .mp3, .xls, .xlsx, .doc, .docx, .ppt, .pptx, .pdf" :on-change="handleFileChange" :on-preview="view" :auto-upload="false" ref="uploadfileComponent" :limit="1" :on-exceed="handleExceed" v-model:file-list="fileList">--> +<!-- <template #trigger>--> +<!-- <el-button type="primary">选择文件</el-button>--> +<!-- </template>--> +<!-- <el-button :disabled="uploadDisabled" style="margin-left: 10px" type="success" @click="handlerUpload">上传</el-button>--> +<!-- <el-button class="ml-3" type="success" @click="resetData" >重置</el-button>--> +<!-- <template #tip>--> +<!-- <br /><br />--> +<!-- <span>上传进度:{{ fakeUploadPercentage }}%</span>--> +<!-- <el-progress :text-inside="true" :stroke-width="26" :percentage="fakeUploadPercentage" />--> +<!-- <div class="el-upload__tip text-red">限制一个文件, 新文件将会覆盖原文件</div>--> +<!-- </template>--> +<!-- </el-upload>--> +<!-- <br>--> +<!-- <div v-if="container.showVideo" style="width: 300px;height: 200px">--> +<!-- <video ref="videoPlayer" class="video-js" style="margin: auto auto"></video>--> +<!-- </div>--> - </div> +<!-- </div>--> </template> <script setup> -import { ElMessage } from "element-plus"; -import videojs from "video.js" -import { computed, nextTick, onMounted, onUnmounted,ref,reactive,watch } from "vue"; -import SparkMD5 from "spark-md5"; -import {uploadFileRequest,mergeFileRequest} from "@/api/onlineEducation/upload" -import pLimit from 'p-limit' - -const videoPlayer = ref(null) -const myPlayer = ref(null) -const uploadDisabled=ref(false) -const chunkSize = ref(10 * 1024 * 1024) // 切片大小 -const uploadedCount=ref(0) //已上传的分配个数 -const fileChunkList=ref([]) -const fileList=ref([]) -const uploadfileComponent=ref(null) -const emit = defineEmits(["getFile"]); -const loading = ref(false) -const props = defineProps({ - responseType: { - type: Number, - default: 0 - } -}) -const container=reactive({ - file:{ - name:'', - percentage:0, - status:1, - size:0, - url:'', - raw:null, - uid:0 - }, - fileMd5:'', - worker:null, - showVideo:false -}) -// 生成文件hash的进度 -const hashPercentage = ref(0) -// 显示在页面上的文件上传进度 -const fakeUploadPercentage = ref(0) -const type = ref(); -onMounted(() => { - type.value = props.responseType - // getVideo(props.responseType) - -}) -const resourcePath = ref(); -const getVideo = (value) => { - type.value = value; - if(value == 1){ - // container.showVideo = true - nextTick(() => { - console.log("111111",videoPlayer.value) - myPlayer.value = videojs(videoPlayer.value, { - poster: "",//视频封面 - controls: true,//视频控件 - autoplay:true,//自动播放 - sources: [ - { - src: resourcePath.value ? import.meta.env.VITE_APP_RESOURCE_API + resourcePath.value : '', - // src:'', - type: 'application/x-mpegURL', - } - ], - controlBar: { - remainingTimeDisplay: { - displayNegative: false - } - }, - playbackRates: [0.5, 1, 1.5, 2]//设置播放速度 - }, onPlayerReady) - }); - } -} -// watch(() => props.responseType, value => getVideo(value)) -onUnmounted(() => { - if (myPlayer.value) { - myPlayer.value.dispose() - } -}) - -const dispose = () => { - // if (myPlayer.value) { - // myPlayer.value.dispose() - // resourcePath.value = '' - // } - container.showVideo = false; - resourcePath.value = '' - hashPercentage.value=0 - uploadPercentage.value=0 - fakeUploadPercentage.value=0 - uploadedCount.value=0 - fileChunkList.value=[] - fileList.value=[] -} - -const changeType = (val) => { - type.value = val - dispose() - if(val == 1){ - container.showVideo = true - nextTick(() => { - getVideo(val) - }) - } -} -const openValue = ref(); -const open = (val) => { - console.log("val",val) - openValue.value = val - fakeUploadPercentage.value = 100 - if(val.resourceType == 1){ - container.showVideo = true - resourcePath.value = val.resourcePath; - getVideo(val.resourceType) - }else { - container.showVideo = false - // if (myPlayer.value) { - // myPlayer.value.dispose() - // } - fileList.value.push({ - path: val.resourcePath, - name: val.originName - }) - } -} -const view = (file) => { - console.log('vlco',file) - // console.log("点击文件=>", file); - const url = import.meta.env.VITE_APP_RESOURCE_API + file.path; - const link = document.createElement("a"); - link.href = url; - link.download = file.name; - // link.target = "_blank"; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); -} -// video初始化完成的回调函数 -const onPlayerReady = () => { - myPlayer.value.log("play.....") - bindVideoEvents() -} -// 绑定事件 -const bindVideoEvents = () => { - if (!myPlayer.value) return - myPlayer.value.on('play', onPlay) - myPlayer.value.on('pause', onPause) - myPlayer.value.on('ended', onEnded) - myPlayer.value.on('timeupdate', onTimeupdate) - myPlayer.value.on('loadedmetadata', onLoadedmetadata) - myPlayer.value.on('fullscreenchange', onFullscreenchange) - myPlayer.value.on('error', err => { - console.log('视频加载发生错误', err) - }) -} - -const onPlay = () => { - console.log('播放视频') -} -const onPause = () => { - console.log('暂停播放') -} -const onEnded = () => {} -const onTimeupdate = () => { - console.log('播放位置已更改时,播放时间更新') -} -// 全屏切换 -const onFullscreenchange = () => { - console.log('全屏状态改变') -} -// 元数据加载完成 -const onLoadedmetadata = () => { - console.log('元数据加载完成') - -} - - -//计算文件上传的进度 -const uploadPercentage= computed({ - get(){ - if(!container.file||!fileChunkList.value.length){ - return 0 - } - const loaded=fileChunkList.value.map(item => item.size * item.percentage).reduce((acc,cur) => { - return acc+cur - }) - console.log('loaded',uploadedCount.value,loaded) - return parseInt((loaded/container.file.size).toFixed(2)) - }, - set(value){ - return value - } -}) - -// watch uploadPercentage,得到fakeUploadPercentage -watch(uploadPercentage, (newValue) => { - if (newValue >= fakeUploadPercentage.value) { - fakeUploadPercentage.value = newValue - } -}) - -const resetData = () => { - container.showVideo = false - resourcePath.value = '' - hashPercentage.value=0 - uploadPercentage.value=0 - fakeUploadPercentage.value=0 - uploadedCount.value=0 - fileChunkList.value=[] - fileList.value=[] - if(container.worker){ - container.worker.onmessage=null - } - // if (myPlayer.value) { - // myPlayer.value.dispose() - // } - const file = { - resourceSize: null, - md5: '', - resourcePath: '', - mediaType: '', - docPage: 0, - resourceLength: '', - originName:'' - } - emit("getFile",file) -} - -//选择了文件 -const handleFileChange=(uploadFile,uploadFiles) =>{ - // resetData() - if(!uploadFile){ - return - } - container.file=uploadFile - fileList.value=uploadFiles -} - -const handleExceed= (files) => { - uploadfileComponent.value.clearFiles() - nextTick(() => { - uploadfileComponent.value.handleStart(files[0]) - }) -} - -//上传 -const handlerUpload= async() => { - - if(type.value == null){ - ElMessage({ - type: 'warning', - message: '请先选择资源类型' - }); - return false - } - - if(!container.file.raw){ - return - } - if(container.file.raw.size > 1024 * 1024 * 1000){ - ElMessage({ - type: 'warning', - message: '文件大小不能超过1G' - }); - return false - } - - const filetype = container.file.raw.name.split(".").pop(); - const extension = (filetype === "mp4" || filetype ==="mp3" || filetype ==="xls" || filetype === "xlsx" || filetype ==="doc" || filetype ==="docx" || filetype === "ppt" || filetype ==="pptx" || filetype ==="pdf"); - if (!extension ) { - ElMessage({ - type: 'warning', - message: '暂不支持该格式上传' - }); - return false; - } - if((type.value == 1 && filetype != 'mp4') || (type.value == 2 && filetype != 'mp3')){ - ElMessage({ - type: 'warning', - message: '请上传所选资源类型的文件' - }); - return false; - } - if(type.value == 3){ - if( filetype == 'xls' || filetype == 'xlsx' || filetype == 'doc'|| filetype == 'docx'|| filetype == 'ppt'|| filetype == 'pptx'|| filetype == 'pdf' ){ - - }else { - ElMessage({ - type: 'warning', - message: '请上传所选资源类型的文件' - }); - return false; - } - } - loading.value = true - //文件分片 - const chunkList=createFileChunk(container.file.raw) - console.log('文件分了多少片:',chunkList.length) - //通过webworker计算出文件hash - container.fileMd5=await calculateMd5(chunkList) - console.log('文件hash1:',container.fileMd5) - // container.fileMd5=await getFileMD5(container.file.raw) - // console.log('文件hash2:',container.hash) - - fileChunkList.value=[] - fileChunkList.value=chunkList.map(({file},index) => ({ - fileMd5:container.fileMd5, - index, - chunkName: `${container.fileMd5}-${index}`, - chunk:file, - size:file.size, - // 如果已上传切片数组uploadedList中包含这个切片,则证明这个切片之前已经上传成功了,进度设为100。 - percentage:0 - })) - - uploadChunks(fileChunkList) - -} - -//文件分片 -const createFileChunk = (file,size=chunkSize.value) => { - const chunkList=[] - let cur=0 - while(cur<file.size){ - chunkList.push({ - file:file.slice(cur,cur+size), - }) - cur+=size - } - return chunkList -} - -//计算文件md5 方法1 -const calculateMd5 = (chunkList) => { - return new Promise((resolve) => { - container.worker=new Worker('/hash.js') - container.worker.postMessage({fileChunkList:chunkList}) - container.worker.onmessage= (e) => { - const {percentage,hash} = e.data - hashPercentage.value=percentage.toFixed(2) - if(hash){ - resolve(hash) - } - } - }) -} - -//计算文件md5 方法2 -const getFileMD5 = (file) => { - return new Promise((resolve, reject) => { - const spark = new SparkMD5.ArrayBuffer() - const fileReader = new FileReader() - fileReader.onload = (e) => { - spark.append(e.target?.result) - resolve(spark.end()) - } - fileReader.onerror = () => { - reject('') - } - fileReader.readAsArrayBuffer(file) - }) -} - -//计算上传进度 -const createProgressHandler = (item) => { - console.log('createProgresshandler -> item', item); - return (p) => { - if(item.percentage>=100){ - item.percentage = 100 - }else{ - item.percentage=parseInt(String((p.loaded/p.total)*100)) - } - // 确保进度百分比不会超过100% - if (item.percentage > 100) item.percentage = 100 - } -} - - - -//上传切片 -const uploadChunks= async(uploadedList) => { - const limit = pLimit(10); // 控制并发数为10 - const requestList=uploadedList.value.map(({chunk,chunkName,index,fileMd5}) => { - const formdata=new FormData() - formdata.append('file',chunk) - formdata.append('chunkName',chunkName) - formdata.append('fileName',container.file.name) - formdata.append('fileMd5',fileMd5) - formdata.append('index',index) - return {formdata,index} - }).map(async ({formdata,index}) => { - return limit(() => doUploadChunk({data:formdata,onUploadProgress:createProgressHandler(fileChunkList.value[index])})) - }) - await Promise.all(requestList) - console.log("数组:",fileChunkList) - if(uploadedCount.value>=fileChunkList.value.length){ - mergeRequest() - } - -} - - -const doUploadChunk = ({data,onUploadProgress}) => { - return new Promise((resolve) => { - uploadFileRequest(data,onUploadProgress).then((result) => { - let resData=result.data - if(result&&result.code==200){ - uploadedCount.value=uploadedCount.value+1 - fileChunkList.value[data.get('index')].percentage=100 //手动更新进度 - console.log(uploadedCount.value,'result--------------') - } - resolve('done') - }) - }) -} - -const mergeRequest = async() => { - if(container.file.name.lastIndexOf(".") === -1){ - ElMessage.warning("请输入文件后缀名") - return - } - let data=await mergeFileRequest({fileMd5:container.fileMd5,fileName:container.file.name}) - console.log(data,"mege------------222") - if(data && data.code==200){ - const filetype = data.data.originName.split(".").pop(); - if(filetype == 'mp4' || filetype == 'MP4'){ - container.showVideo = true - await nextTick(() => { - - console.log("myPlayer.value",myPlayer.value) - myPlayer.value.src( - { - src: import.meta.env.VITE_APP_RESOURCE_API +data.data.path, - type: 'application/x-mpegURL', - }) - // myPlayer.value.load() - myPlayer.value.play().catch((error) => { - console.error('Error playing video:', error); - }); - }) - // myPlayer.value.pause() - //myPlayer.value.reset() - } - const file = { - resourceSize: data.data.size, - md5: data.data.md5, - resourcePath: data.data.path, - mediaType: filetype, - docPage: data.data.docPage, - resourceLength: data.data.resourceLength, - originName: data.data.originName - } - emit("getFile",file) - - - loading.value = false - ElMessage.success("上传成功") - }else{ - ElMessage.success("合并数据失败") - } -} - -defineExpose({ - dispose, - changeType, - open -}); +// import { ElMessage } from "element-plus"; +// import videojs from "video.js" +// import { computed, nextTick, onMounted, onUnmounted,ref,reactive,watch } from "vue"; +// import SparkMD5 from "spark-md5"; +// import {uploadFileRequest,mergeFileRequest} from "@/api/onlineEducation/upload" +// import pLimit from 'p-limit' +// +// const videoPlayer = ref(null) +// const myPlayer = ref(null) +// const uploadDisabled=ref(false) +// const chunkSize = ref(10 * 1024 * 1024) // 切片大小 +// const uploadedCount=ref(0) //已上传的分配个数 +// const fileChunkList=ref([]) +// const fileList=ref([]) +// const uploadfileComponent=ref(null) +// const emit = defineEmits(["getFile"]); +// const loading = ref(false) +// const props = defineProps({ +// responseType: { +// type: Number, +// default: 0 +// } +// }) +// const container=reactive({ +// file:{ +// name:'', +// percentage:0, +// status:1, +// size:0, +// url:'', +// raw:null, +// uid:0 +// }, +// fileMd5:'', +// worker:null, +// showVideo:false +// }) +// // 生成文件hash的进度 +// const hashPercentage = ref(0) +// // 显示在页面上的文件上传进度 +// const fakeUploadPercentage = ref(0) +// const type = ref(); +// onMounted(() => { +// type.value = props.responseType +// // getVideo(props.responseType) +// +// }) +// const resourcePath = ref(); +// const getVideo = (value) => { +// type.value = value; +// if(value == 1){ +// // container.showVideo = true +// nextTick(() => { +// console.log("111111",videoPlayer.value) +// myPlayer.value = videojs(videoPlayer.value, { +// poster: "",//视频封面 +// controls: true,//视频控件 +// autoplay:true,//自动播放 +// sources: [ +// { +// src: resourcePath.value ? import.meta.env.VITE_APP_RESOURCE_API + resourcePath.value : '', +// // src:'', +// type: 'application/x-mpegURL', +// } +// ], +// controlBar: { +// remainingTimeDisplay: { +// displayNegative: false +// } +// }, +// playbackRates: [0.5, 1, 1.5, 2]//设置播放速度 +// }, onPlayerReady) +// }); +// } +// } +// // watch(() => props.responseType, value => getVideo(value)) +// onUnmounted(() => { +// if (myPlayer.value) { +// myPlayer.value.dispose() +// } +// }) +// +// const dispose = () => { +// // if (myPlayer.value) { +// // myPlayer.value.dispose() +// // resourcePath.value = '' +// // } +// container.showVideo = false; +// resourcePath.value = '' +// hashPercentage.value=0 +// uploadPercentage.value=0 +// fakeUploadPercentage.value=0 +// uploadedCount.value=0 +// fileChunkList.value=[] +// fileList.value=[] +// } +// +// const changeType = (val) => { +// type.value = val +// dispose() +// if(val == 1){ +// container.showVideo = true +// nextTick(() => { +// getVideo(val) +// }) +// } +// } +// const openValue = ref(); +// const open = (val) => { +// console.log("val",val) +// openValue.value = val +// fakeUploadPercentage.value = 100 +// if(val.resourceType == 1){ +// container.showVideo = true +// resourcePath.value = val.resourcePath; +// getVideo(val.resourceType) +// }else { +// container.showVideo = false +// // if (myPlayer.value) { +// // myPlayer.value.dispose() +// // } +// fileList.value.push({ +// path: val.resourcePath, +// name: val.originName +// }) +// } +// } +// const view = (file) => { +// console.log('vlco',file) +// // console.log("点击文件=>", file); +// const url = import.meta.env.VITE_APP_RESOURCE_API + file.path; +// const link = document.createElement("a"); +// link.href = url; +// link.download = file.name; +// // link.target = "_blank"; +// document.body.appendChild(link); +// link.click(); +// document.body.removeChild(link); +// } +// // video初始化完成的回调函数 +// const onPlayerReady = () => { +// myPlayer.value.log("play.....") +// bindVideoEvents() +// } +// // 绑定事件 +// const bindVideoEvents = () => { +// if (!myPlayer.value) return +// myPlayer.value.on('play', onPlay) +// myPlayer.value.on('pause', onPause) +// myPlayer.value.on('ended', onEnded) +// myPlayer.value.on('timeupdate', onTimeupdate) +// myPlayer.value.on('loadedmetadata', onLoadedmetadata) +// myPlayer.value.on('fullscreenchange', onFullscreenchange) +// myPlayer.value.on('error', err => { +// console.log('视频加载发生错误', err) +// }) +// } +// +// const onPlay = () => { +// console.log('播放视频') +// } +// const onPause = () => { +// console.log('暂停播放') +// } +// const onEnded = () => {} +// const onTimeupdate = () => { +// console.log('播放位置已更改时,播放时间更新') +// } +// // 全屏切换 +// const onFullscreenchange = () => { +// console.log('全屏状态改变') +// } +// // 元数据加载完成 +// const onLoadedmetadata = () => { +// console.log('元数据加载完成') +// +// } +// +// +// //计算文件上传的进度 +// const uploadPercentage= computed({ +// get(){ +// if(!container.file||!fileChunkList.value.length){ +// return 0 +// } +// const loaded=fileChunkList.value.map(item => item.size * item.percentage).reduce((acc,cur) => { +// return acc+cur +// }) +// console.log('loaded',uploadedCount.value,loaded) +// return parseInt((loaded/container.file.size).toFixed(2)) +// }, +// set(value){ +// return value +// } +// }) +// +// // watch uploadPercentage,得到fakeUploadPercentage +// watch(uploadPercentage, (newValue) => { +// if (newValue >= fakeUploadPercentage.value) { +// fakeUploadPercentage.value = newValue +// } +// }) +// +// const resetData = () => { +// container.showVideo = false +// resourcePath.value = '' +// hashPercentage.value=0 +// uploadPercentage.value=0 +// fakeUploadPercentage.value=0 +// uploadedCount.value=0 +// fileChunkList.value=[] +// fileList.value=[] +// if(container.worker){ +// container.worker.onmessage=null +// } +// // if (myPlayer.value) { +// // myPlayer.value.dispose() +// // } +// const file = { +// resourceSize: null, +// md5: '', +// resourcePath: '', +// mediaType: '', +// docPage: 0, +// resourceLength: '', +// originName:'' +// } +// emit("getFile",file) +// } +// +// //选择了文件 +// const handleFileChange=(uploadFile,uploadFiles) =>{ +// // resetData() +// if(!uploadFile){ +// return +// } +// container.file=uploadFile +// fileList.value=uploadFiles +// } +// +// const handleExceed= (files) => { +// uploadfileComponent.value.clearFiles() +// nextTick(() => { +// uploadfileComponent.value.handleStart(files[0]) +// }) +// } +// +// //上传 +// const handlerUpload= async() => { +// +// if(type.value == null){ +// ElMessage({ +// type: 'warning', +// message: '请先选择资源类型' +// }); +// return false +// } +// +// if(!container.file.raw){ +// return +// } +// if(container.file.raw.size > 1024 * 1024 * 1000){ +// ElMessage({ +// type: 'warning', +// message: '文件大小不能超过1G' +// }); +// return false +// } +// +// const filetype = container.file.raw.name.split(".").pop(); +// const extension = (filetype === "mp4" || filetype ==="mp3" || filetype ==="xls" || filetype === "xlsx" || filetype ==="doc" || filetype ==="docx" || filetype === "ppt" || filetype ==="pptx" || filetype ==="pdf"); +// if (!extension ) { +// ElMessage({ +// type: 'warning', +// message: '暂不支持该格式上传' +// }); +// return false; +// } +// if((type.value == 1 && filetype != 'mp4') || (type.value == 2 && filetype != 'mp3')){ +// ElMessage({ +// type: 'warning', +// message: '请上传所选资源类型的文件' +// }); +// return false; +// } +// if(type.value == 3){ +// if( filetype == 'xls' || filetype == 'xlsx' || filetype == 'doc'|| filetype == 'docx'|| filetype == 'ppt'|| filetype == 'pptx'|| filetype == 'pdf' ){ +// +// }else { +// ElMessage({ +// type: 'warning', +// message: '请上传所选资源类型的文件' +// }); +// return false; +// } +// } +// loading.value = true +// //文件分片 +// const chunkList=createFileChunk(container.file.raw) +// console.log('文件分了多少片:',chunkList.length) +// //通过webworker计算出文件hash +// container.fileMd5=await calculateMd5(chunkList) +// console.log('文件hash1:',container.fileMd5) +// // container.fileMd5=await getFileMD5(container.file.raw) +// // console.log('文件hash2:',container.hash) +// +// fileChunkList.value=[] +// fileChunkList.value=chunkList.map(({file},index) => ({ +// fileMd5:container.fileMd5, +// index, +// chunkName: `${container.fileMd5}-${index}`, +// chunk:file, +// size:file.size, +// // 如果已上传切片数组uploadedList中包含这个切片,则证明这个切片之前已经上传成功了,进度设为100。 +// percentage:0 +// })) +// +// uploadChunks(fileChunkList) +// +// } +// +// //文件分片 +// const createFileChunk = (file,size=chunkSize.value) => { +// const chunkList=[] +// let cur=0 +// while(cur<file.size){ +// chunkList.push({ +// file:file.slice(cur,cur+size), +// }) +// cur+=size +// } +// return chunkList +// } +// +// //计算文件md5 方法1 +// const calculateMd5 = (chunkList) => { +// return new Promise((resolve) => { +// container.worker=new Worker('/hash.js') +// container.worker.postMessage({fileChunkList:chunkList}) +// container.worker.onmessage= (e) => { +// const {percentage,hash} = e.data +// hashPercentage.value=percentage.toFixed(2) +// if(hash){ +// resolve(hash) +// } +// } +// }) +// } +// +// //计算文件md5 方法2 +// const getFileMD5 = (file) => { +// return new Promise((resolve, reject) => { +// const spark = new SparkMD5.ArrayBuffer() +// const fileReader = new FileReader() +// fileReader.onload = (e) => { +// spark.append(e.target?.result) +// resolve(spark.end()) +// } +// fileReader.onerror = () => { +// reject('') +// } +// fileReader.readAsArrayBuffer(file) +// }) +// } +// +// //计算上传进度 +// const createProgressHandler = (item) => { +// console.log('createProgresshandler -> item', item); +// return (p) => { +// if(item.percentage>=100){ +// item.percentage = 100 +// }else{ +// item.percentage=parseInt(String((p.loaded/p.total)*100)) +// } +// // 确保进度百分比不会超过100% +// if (item.percentage > 100) item.percentage = 100 +// } +// } +// +// +// +// //上传切片 +// const uploadChunks= async(uploadedList) => { +// const limit = pLimit(10); // 控制并发数为10 +// const requestList=uploadedList.value.map(({chunk,chunkName,index,fileMd5}) => { +// const formdata=new FormData() +// formdata.append('file',chunk) +// formdata.append('chunkName',chunkName) +// formdata.append('fileName',container.file.name) +// formdata.append('fileMd5',fileMd5) +// formdata.append('index',index) +// return {formdata,index} +// }).map(async ({formdata,index}) => { +// return limit(() => doUploadChunk({data:formdata,onUploadProgress:createProgressHandler(fileChunkList.value[index])})) +// }) +// await Promise.all(requestList) +// console.log("数组:",fileChunkList) +// if(uploadedCount.value>=fileChunkList.value.length){ +// mergeRequest() +// } +// +// } +// +// +// const doUploadChunk = ({data,onUploadProgress}) => { +// return new Promise((resolve) => { +// uploadFileRequest(data,onUploadProgress).then((result) => { +// let resData=result.data +// if(result&&result.code==200){ +// uploadedCount.value=uploadedCount.value+1 +// fileChunkList.value[data.get('index')].percentage=100 //手动更新进度 +// console.log(uploadedCount.value,'result--------------') +// } +// resolve('done') +// }) +// }) +// } +// +// const mergeRequest = async() => { +// if(container.file.name.lastIndexOf(".") === -1){ +// ElMessage.warning("请输入文件后缀名") +// return +// } +// let data=await mergeFileRequest({fileMd5:container.fileMd5,fileName:container.file.name}) +// console.log(data,"mege------------222") +// if(data && data.code==200){ +// const filetype = data.data.originName.split(".").pop(); +// if(filetype == 'mp4' || filetype == 'MP4'){ +// container.showVideo = true +// await nextTick(() => { +// +// console.log("myPlayer.value",myPlayer.value) +// myPlayer.value.src( +// { +// src: import.meta.env.VITE_APP_RESOURCE_API +data.data.path, +// type: 'application/x-mpegURL', +// }) +// // myPlayer.value.load() +// myPlayer.value.play().catch((error) => { +// console.error('Error playing video:', error); +// }); +// }) +// // myPlayer.value.pause() +// //myPlayer.value.reset() +// } +// const file = { +// resourceSize: data.data.size, +// md5: data.data.md5, +// resourcePath: data.data.path, +// mediaType: filetype, +// docPage: data.data.docPage, +// resourceLength: data.data.resourceLength, +// originName: data.data.originName +// } +// emit("getFile",file) +// +// +// loading.value = false +// ElMessage.success("上传成功") +// }else{ +// ElMessage.success("合并数据失败") +// } +// } +// +// defineExpose({ +// dispose, +// changeType, +// open +// }); </script> - - -<style scoped> -.greetings{ - :deep(.video-js) { - width: 300px; - height: 200px; - } - :deep(.el-icon--close) { - display: none; - } -} - - - -h1 { - font-weight: 500; - font-size: 2.6rem; - position: relative; - top: -10px; -} - -h3 { - font-size: 1.2rem; -} - -.greetings h1, -.greetings h3 { - text-align: center; -} - -@media (min-width: 1024px) { - .greetings h1, - .greetings h3 { - text-align: left; - } -} -</style> -- Gitblit v1.9.2