2 lines
7.6 KiB
JavaScript
Raw Normal View History

2025-05-29 15:03:59 +08:00
import{Z as y,a2 as X,_ as Y,z as ee,r as d,O as L,a3 as le,D as ae,j as i,h as H,o as S,w as t,e as s,c as F,I as te,J as se,f as a,m as O,B as C,i as oe,a4 as P}from"./index-CrAWI0wi.js";function xe(o){return y({url:"/file/info/list",method:"get",params:o})}function Ie(o){return y({url:"/file/info/"+o,method:"delete"})}function Ue({storageType:o,clientName:h,filePath:g}){return y({url:`/file/${o}/${h}/download`,method:"get",params:{filePath:g},responseType:"blob",headers:{Authorization:"Bearer "+X()}})}function ne(){return y({url:"/file/client-list",method:"get"})}function ue(o){return y({url:"/file/initUpload",method:"post",params:{fileName:o.fileName,fileSize:o.fileSize,fileType:o.fileType,bucketName:o.clientName}})}function ie(o,h,g,z){const b=new FormData;return b.append("chunk",z),y({url:"/file/uploadChunk",method:"post",params:{uploadId:o,filePath:h,chunkIndex:g},data:b,headers:{"Content-Type":"multipart/form-data",repeatSubmit:!1}})}function re(o){const{uploadId:h,filePath:g,partETags:z}=o;return y({url:"/file/completeUpload",method:"post",params:{uploadId:h,filePath:g},data:z})}const ce={class:"card-header"},de={class:"file-name"},pe={class:"file-details"},me={class:"detail-item"},fe={class:"detail-value"},_e={class:"detail-item"},ve={class:"detail-value"},he={class:"progress-info"},ge={class:"progress-text"},be={key:0,class:"el-icon-loading progress-icon"},ke={class:"progress-message"},we={class:"progress-text"},Ne={class:"dialog-footer"},Ce={key:0,class:"el-icon-upload2"},ye={key:1,class:"el-icon-loading"},ze={__name:"ChunkUpload",props:{modelValue:{type:Boolean,default:!1}},emits:["update:modelValue","upload-success"],setup(o,{emit:h}){const g=o,z=h,b=ee({get(){return g.modelValue},set(l){z("update:modelValue",l)}}),u=d(null),p=L({clientName:""}),c=L({fileName:"",fileSize:0,totalChunks:0}),B=d(10),$=d(0),x=d(""),r=L({currentChunk:0,message:""}),V=d(!1),T=d(""),M=d(""),I=d([]),U=d([]),E=d(!1);async function R(){E.value=!0;try{const l=await ne();l.code===200&&l.data&&(U.value=Object.entries(l.data).flatMap(([e,f])=>f.map(k=>({value:e,label:`${e} - ${k}`,clientName:k}))),U.value.length>0&&(p.clientName=U.value[0].value))}catch(l){console.error("获取存储桶列表失败",l)}finally{E.value=!1}}function K(l){return u.value=l,c.fileName=l.name,c.fileSize=(l.size/(1024*1024)).toFixed(2),q(),!1}function q(){if(!u.value)return;const l=u.value.size,e=B.value*1024*1024;c.totalChunks=Math.ceil(l/e)}async function Q(){if(!u.value){P.warning("请先选择文件");return}if(!p.clientName){P.warning("请选择存储桶");return}try{V.value=!0,x.value="",r.message="开始初始化上传...",I.value=[];const l=B.value*1024*1024,e=[];let f=0;for(;f<u.value.size;)e.push(u.value.slice(f,f+l)),f+=l;const k=e.length;let _=0;const{data:w}=await ue({fileName:u.value.name,fileSize:u.value.size,fileType:u.value.name.split(".").pop(),clientName:p.clientName,bucketName:p.clientName});if(!w||!w.uploadId||!w.filePath)throw new Error("初始化上传失败");T.value=w.uploadId,M.value=w.filePath,r.message="初始化成功,开始上传分片...";for(let n=0;n<e.length;n++){const N=e[n];new FormData().append("chunk",new File([N],`${u.value.name}_${n}`,{type:u.value.type}));try{const{data:v}=await ie(T.value,M.value,n,N);if(!v||!v.etag)throw new Error("服务器返回的分片信息无效");I.value.push({partNumber:n+1,eTag:v.etag}),_++,$.value=Math.round(_/k*100),r.currentChunk=n,r.message=`已上传 ${$.value}% (分片 ${n+1}/${k})`,await new Promise(j=>setTimeout(j,100))}catch(v){throw console.error("分片上传失败:",v),new Error(`分片 ${n+1} 上传失败: ${v.message}`)}}r.message="正在合并分片...",I.value.sort((n,N)=>n.partNumber-N.partNumber);const{data:D}=await re({uploadId:T.value,filePath:M.value,partETags:I.value,clientName:p.clientName});x.value="success",r.message="上传完成",P.success("文件上传成功"),z("upload-success",D),J()}catch(l){x.value="exception",r.message=`上传失败: ${l.message}`,P.error(`文件上传失败: ${l.message}`),console.error("分片上传失败",l)}finally{V.value=!1}}function A