2 lines
6.2 KiB
JavaScript
2 lines
6.2 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{bV as x,o as K,M as C,a8 as X,p as P,q as w,r as D,v as L,D as z,ah as H,bW as W,O as G,s as U,F as J,G as Y,T as Z,bX as Q,bt as ee,P as re}from"./.pnpm-BSw4l71J.js";import{u as ae,e as te,p as A,R as _,i as v,_ as se}from"./index-C5omO-nb.js";import{j as le,k as ce}from"./file--nSnYOw1.js";const ne=5*1024*1024,oe=3;async function O(e){try{return await e()}catch(r){throw new B(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(()=>le({type:e.type,name:e.file.name}));if(r.fallback)throw((d=e.onFallback)==null?void 0:d.call(e,r.provider))??!1?new $(r.provider):new $(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 f=Math.round(r.max_size/1024/1024);throw new Error(`文件体积超出上限(${f}MB)`)}const t=r.credentials,S=r.expired_time??0,p=r.start_time??Math.floor(Date.now()/1e3),E=new x({getAuthorization(f,y){y({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((f,y)=>{E.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){y(c);return}f()})});const u=await O(()=>ce({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 $ extends Error{constructor(t){super(`COS 直传不可用,当前驱动: ${t}`);b(this,"provider");this.name="DirectUploadFallbackError",this.provider=t}}class B extends Error{constructor(t){super("");b(this,"originalError");this.name="DirectUploadApiError",this.originalError=t}}const ue=K({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=ae(),S=te(),p=X(),E=C(`${A.baseUrl}${A.urlPrefix}/upload/${e.type}`),h=P(()=>({token:t.token,version:S.config.version})),u=C(!1),d=C([]),i=["video","voice","desktop_package"],f=P(()=>e.direct&&i.includes(e.type)),y=()=>{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==_.SUCCESS&&r("success",a),a.code==_.FAIL&&a.msg&&v.msgError(a.msg)},F=(a,o)=>{var n;if(c++,c==d.value.length&&(c=0,d.value=[],r("allSuccess")),!(a instanceof B)){const g=a instanceof Error?a.message:"";v.msgError(g||`${o.name}文件上传失败`)}(n=p.value)==null||n.abort(o),u.value=!1,r("change",o),r("error",o)},R=()=>{v.msgError(`超出上传上限${e.limit},请重新上传`)},M=()=>{d.value=[],u.value=!1},j=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"*"}}),q=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(m){var T;(T=a.onProgress)==null||T.call(a,{percent:m.percent,loaded:m.loaded,total:m.total})}});(n=a.onSuccess)==null||n.call(a,{code:_.SUCCESS,msg:"ok",data:l})}catch(l){if(l instanceof $){if(e.type==="desktop_package"){(g=a.onError)==null||g.call(a,new Error("当前未启用腾讯云 COS,安装包无法直传,请配置 COS 后重试"));return}v.msgWarning("当前存储不支持直传,已切换为普通上传"),await I(a);return}(s=a.onError)==null||s.call(a,l instanceof Error?l:new Error(String((l==null?void 0:l.message)??l)))}},I=a=>new Promise(o=>{const n=new XMLHttpRequest;n.open("POST",E.value),Object.entries(h.value).forEach(([s,l])=>n.setRequestHeader(s,String(l??""))),n.upload.onprogress=s=>{var m;if(!s.lengthComputable)return;const l=s.loaded/s.total*100;(m=a.onProgress)==null||m.call(a,{percent:l,loaded:s.loaded,total:s.total})},n.onload=()=>{var s,l;try{const m=JSON.parse(n.responseText);(s=a.onSuccess)==null||s.call(a,m)}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:E,headers:h,visible:u,fileList:d,useDirect:f,httpRequest:q,getAccept:j,handleProgress:y,handleSuccess:k,handleError:F,handleExceed:R,handleClose:M}}}),fe={class:"upload"},me={class:"file-list p-4"},ge={class:"flex-1"};function pe(e,r,t,S,p,E){const h=W,u=Q,d=ee;return w(),D("div",fe,[L(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:z(()=>[H(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?(w(),G(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:z(()=>[U("div",me,[(w(!0),D(J,null,Y(e.fileList,(i,f)=>(w(),D("div",{key:f,class:"mb-5"},[U("div",null,Z(i.name),1),U("div",ge,[L(u,{percentage:parseInt(i.percentage)},null,8,["percentage"])])]))),128))])]),_:1},8,["modelValue","onClose"])):re("",!0)])}const we=se(ue,[["render",pe]]);export{we as U};
|