2 lines
6.4 KiB
JavaScript
2 lines
6.4 KiB
JavaScript
var N=Object.defineProperty;var V=(e,r,t)=>r in e?N(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t;var b=(e,r,t)=>V(e,typeof r!="symbol"?r+"":r,t);import{a0 as x,a1 as K,V as H}from"./element-plus-CWHdHlgZ.js";import{u as J,e as X,q as T,R as C,j as w,_ as G}from"./index-MKPKssyT.js";import{C as Q}from"./cos-js-sdk-v5-DSMN0LUT.js";import{j as W,k as Y}from"./file-pgRi9w1O.js";import{f as Z,A as P,ak as v,I as U,a as z,aN as A,aq as ee,G as re,J as _,F as ae,ap as te,H as se}from"./@vue/runtime-core-C6bnekPw.js";import{n as $,q as le}from"./@vue/reactivity-DiY1c2vO.js";import{Q as ce}from"./@vue/shared-mAAVTE9n.js";const ne=5*1024*1024,oe=3;async function O(e){try{return await e()}catch(r){throw new q(r)}}function de(e,r){const t=(r.name.split(".").pop()||"bin").toLowerCase(),S=Date.now(),p=Math.random().toString(36).slice(2,10);return`${e}${S}-${p}.${t}`}async function ie(e){var d,i;const r=await O(()=>W({type:e.type,name:e.file.name}));if(r.fallback)throw((d=e.onFallback)==null?void 0:d.call(e,r.provider))??!1?new D(r.provider):new D(r.provider);if(!r.credentials||!r.bucket||!r.region||!r.key_prefix)throw new Error("STS 凭证返回缺失字段");if(r.max_size&&e.file.size>r.max_size){const m=Math.round(r.max_size/1024/1024);throw new Error(`文件体积超出上限(${m}MB)`)}const t=r.credentials,S=r.expired_time??0,p=r.start_time??Math.floor(Date.now()/1e3),y=new Q({getAuthorization(m,E){E({TmpSecretId:t.tmpSecretId,TmpSecretKey:t.tmpSecretKey,SecurityToken:t.sessionToken,StartTime:p,ExpiredTime:S})}}),h=r.object_key||de(r.key_prefix,e.file);await new Promise((m,E)=>{y.uploadFile({Bucket:r.bucket,Region:r.region,Key:h,Body:e.file,SliceSize:ne,AsyncLimit:oe,onProgress(c){if(!e.onProgress)return;const k=c.total||e.file.size;e.onProgress({percent:Math.min(99,Math.round((c.percent||0)*100)),loaded:c.loaded||0,total:k,speed:c.speed||0})}},c=>{if(c){E(c);return}m()})});const u=await O(()=>Y({type:e.type,key:h,name:e.file.name,size:e.file.size,content_type:e.file.type||"",cid:e.cid??0}));return(i=e.onProgress)==null||i.call(e,{percent:100,loaded:e.file.size,total:e.file.size,speed:0}),u}class D extends Error{constructor(t){super(`COS 直传不可用,当前驱动: ${t}`);b(this,"provider");this.name="DirectUploadFallbackError",this.provider=t}}class q extends Error{constructor(t){super("");b(this,"originalError");this.name="DirectUploadApiError",this.originalError=t}}const ue=Z({components:{},props:{type:{type:String,default:"image"},multiple:{type:Boolean,default:!0},limit:{type:Number,default:10},data:{type:Object,default:()=>({})},showProgress:{type:Boolean,default:!1},direct:{type:Boolean,default:!1}},emits:["change","error","success","allSuccess"],setup(e,{emit:r}){const t=J(),S=X(),p=le(),y=$(`${T.baseUrl}${T.urlPrefix}/upload/${e.type}`),h=P(()=>({token:t.token,version:S.config.version})),u=$(!1),d=$([]),i=["video","voice","desktop_package"],m=P(()=>e.direct&&i.includes(e.type)),E=()=>{u.value=!0};let c=0;const k=(a,o)=>{c++,c==d.value.length&&(c=0,d.value=[],r("allSuccess")),r("change",o),a.code==C.SUCCESS&&r("success",a),a.code==C.FAIL&&a.msg&&w.msgError(a.msg)},B=(a,o)=>{var n;if(c++,c==d.value.length&&(c=0,d.value=[],r("allSuccess")),!(a instanceof q)){const g=a instanceof Error?a.message:"";w.msgError(g||`${o.name}文件上传失败`)}(n=p.value)==null||n.abort(o),u.value=!1,r("change",o),r("error",o)},R=()=>{w.msgError(`超出上传上限${e.limit},请重新上传`)},j=()=>{d.value=[],u.value=!1},I=P(()=>{switch(e.type){case"image":return".jpg,.png,.gif,.jpeg,.ico";case"video":return".wmv,.avi,.mpg,.mpeg,.3gp,.mov,.mp4,.flv,.rmvb,.mkv";case"voice":return".mp3,.wav,.wma,.m4a,.aac,.amr";case"desktop_package":return".exe,.zip";default:return"*"}}),F=async a=>{var o,n,g,s;u.value=!0;try{const l=await ie({file:a.file,type:e.type,cid:Number(((o=a.data)==null?void 0:o.cid)??0),onProgress(f){var L;(L=a.onProgress)==null||L.call(a,{percent:f.percent,loaded:f.loaded,total:f.total})}});(n=a.onSuccess)==null||n.call(a,{code:C.SUCCESS,msg:"ok",data:l})}catch(l){if(l instanceof D){if(e.type==="desktop_package"){(g=a.onError)==null||g.call(a,new Error("当前未启用腾讯云 COS,安装包无法直传,请配置 COS 后重试"));return}w.msgWarning("当前存储不支持直传,已切换为普通上传"),await M(a);return}(s=a.onError)==null||s.call(a,l instanceof Error?l:new Error(String((l==null?void 0:l.message)??l)))}},M=a=>new Promise(o=>{const n=new XMLHttpRequest;n.open("POST",y.value),Object.entries(h.value).forEach(([s,l])=>n.setRequestHeader(s,String(l??""))),n.upload.onprogress=s=>{var f;if(!s.lengthComputable)return;const l=s.loaded/s.total*100;(f=a.onProgress)==null||f.call(a,{percent:l,loaded:s.loaded,total:s.total})},n.onload=()=>{var s,l;try{const f=JSON.parse(n.responseText);(s=a.onSuccess)==null||s.call(a,f)}catch{(l=a.onError)==null||l.call(a,new Error("上传响应解析失败"))}o()},n.onerror=()=>{var s;(s=a.onError)==null||s.call(a,new Error("网络错误")),o()};const g=new FormData;g.append("file",a.file),Object.entries(a.data||{}).forEach(([s,l])=>g.append(s,String(l))),n.send(g)});return{uploadRefs:p,action:y,headers:h,visible:u,fileList:d,useDirect:m,httpRequest:F,getAccept:I,handleProgress:E,handleSuccess:k,handleError:B,handleExceed:R,handleClose:j}}}),me={class:"upload"},fe={class:"file-list p-4"},ge={class:"flex-1"};function pe(e,r,t,S,p,y){const h=x,u=K,d=H;return v(),U("div",me,[z(h,{"file-list":e.fileList,"onUpdate:fileList":r[0]||(r[0]=i=>e.fileList=i),ref:"uploadRefs",action:e.action,multiple:e.multiple,limit:e.limit,"show-file-list":!1,headers:e.headers,data:e.data,"http-request":e.useDirect?e.httpRequest:void 0,"on-progress":e.handleProgress,"on-success":e.handleSuccess,"on-exceed":e.handleExceed,"on-error":e.handleError,accept:e.getAccept},{default:A(()=>[ee(e.$slots,"default")]),_:3},8,["file-list","action","multiple","limit","headers","data","http-request","on-progress","on-success","on-exceed","on-error","accept"]),e.showProgress&&e.fileList.length?(v(),re(d,{key:0,modelValue:e.visible,"onUpdate:modelValue":r[1]||(r[1]=i=>e.visible=i),title:"上传进度","close-on-click-modal":!1,width:"500px",modal:!1,onClose:e.handleClose},{default:A(()=>[_("div",fe,[(v(!0),U(ae,null,te(e.fileList,(i,m)=>(v(),U("div",{key:m,class:"mb-5"},[_("div",null,ce(i.name),1),_("div",ge,[z(u,{percentage:parseInt(i.percentage)},null,8,["percentage"])])]))),128))])]),_:1},8,["modelValue","onClose"])):se("",!0)])}const Ce=G(ue,[["render",pe]]);export{Ce as U};
|