Files
zyt/server/public/admin/assets/index-BOOuIgrt.js
T

2 lines
6.4 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.
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};