2025-05-29 15:03:59 +08:00

2 lines
7.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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(){u.value=null,c.fileName="",c.fileSize=0,c.totalChunks=0,$.value=0,x.value="",r.currentChunk=0,r.message="",T.value="",M.value="",I.value=[]}function J(){A(),b.value=!1}return le(b,l=>{l?U.value.length===0&&R():A()}),ae(()=>{R()}),(l,e)=>{const f=i("el-option"),k=i("el-select"),_=i("el-form-item"),w=i("el-upload"),D=i("el-input-number"),n=i("el-col"),N=i("el-row"),Z=i("el-card"),v=i("el-progress"),j=i("el-form"),G=i("el-button"),W=i("el-dialog");return S(),H(W,{modelValue:b.value,"onUpdate:modelValue":e[2]||(e[2]=m=>b.value=m),title:"分片上传",width:"600px","append-to-body":"",class:"custom-upload-dialog"},{footer:t(()=>[a("div",Ne,[s(G,{onClick:J,size:"medium",class:"btn-cancel"},{default:t(()=>e[8]||(e[8]=[a("i",{class:"el-icon-close"},null,-1),O(" 取消 ")])),_:1}),s(G,{type:"primary",disabled:!u.value||V.value||!p.clientName,onClick:Q,size:"medium",class:"btn-upload"},{default:t(()=>[V.value?(S(),F("i",ye)):(S(),F("i",Ce)),O(" "+C(V.value?"上传中...":"开始上传"),1)]),_:1},8,["disabled"])])]),default:t(()=>[s(j,{model:p,"label-width":"120px",class:"upload-form"},{default:t(()=>[s(_,{label:"存储桶",prop:"clientName"},{default:t(()=>[s(k,{modelValue:p.clientName,"onUpdate:modelValue":e[0]||(e[0]=m=>p.clientName=m),placeholder:"请选择存储桶",clearable:"",loading:E.value,class:"el-select-custom"},{default:t(()=>[(S(!0),F(te,null,se(U.value,m=>(S(),H(f,{key:m.value,label:m.label,value:m.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading"])]),_:1}),s(_,{label:"选择文件"},{default:t(()=>[s(w,{class:"custom-upload-area",drag:"","show-file-list":!1,"before-upload":K},{default:t(()=>e[3]||(e[3]=[a("div",{class:"upload-content"},[a("i",{class:"el-icon-upload el-icon--primary upload-icon"}),a("div",{class:"upload-text"},[O("将文件拖到此处,或"),a("em",{class:"upload-link"},"点击上传")]),a("div",{class:"upload-tip"},"支持拖拽上传最大文件500MB")],-1)])),_:1})]),_:1}),s(_,{label:"分片大小"},{default:t(()=>[s(D,{modelValue:B.value,"onUpdate:modelValue":e[1]||(e[1]=m=>B.value=m),min:1,max:100,step:1,size:"small","controls-position":"right",onChange:q,class:"el-input-number-custom"},null,8,["modelValue"]),e[4]||(e[4]=a("span",{class:"unit"},"MB",-1))]),_:1}),s(_,{label:"文件信息"},{default:t(()=>[s(Z,{class:"custom-file-info-card"},{header:t(()=>[a("div",ce,[e[5]||(e[5]=a("i",{class:"el-icon-document file-icon"},null,-1)),a("span",de,C(c.fileName||"未选择文件"),1)])]),default:t(()=>[a("div",pe,[s(N,{gutter:20},{default:t(()=>[s(n,{span:12},{default:t(()=>[a("div",me,[e[6]||(e[6]=a("span",{class:"detail-label"},"文件大小:",-1)),a("span",fe,C(c.fileSize||"0")+" MB",1)])]),_:1}),s(n,{span:12},{default:t(()=>[a("div",_e,[e[7]||(e[7]=a("span",{class:"detail-label"},"总分片数:",-1)),a("span",ve,C(c.totalChunks||"0"),1)])]),_:1})]),_:1})])]),_:1})]),_:1}),s(_,{label:"上传进度"},{default:t(()=>[s(v,{percentage:$.value,status:x.value,"stroke-width":18,"show-text":!1,class:"custom-progress"},null,8,["percentage","status"]),a("div",he,[s(N,{gutter:20},{default:t(()=>[s(n,{span:12},{default:t(()=>[a("div",ge,[V.value?(S(),F("i",be)):oe("",!0),a("span",ke,C(r.message||"等待上传..."),1)])]),_:1}),s(n,{span:12,class:"text-right"},{default:t(()=>[a("div",we,[a("span",null,"分片: "+C(r.currentChunk+1)+" / "+C(c.totalChunks||"0"),1)])]),_:1})]),_:1})])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"])}}},Ve=Y(ze,[["__scopeId","data-v-0569b3d1"]]),Be=Object.freeze(Object.defineProperty({__proto__:null,default:Ve},Symbol.toStringTag,{value:"Module"}));export{Ve as C,Ue as a,Be as b,Ie as d,ne as g,xe as l};