2 lines
5.7 KiB
JavaScript
2 lines
5.7 KiB
JavaScript
var M=Object.defineProperty;var q=(e,r,s)=>r in e?M(e,r,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[r]=s;var D=(e,r,s)=>q(e,typeof r!="symbol"?r+"":r,s);import{bV as I,o as V,M as k,a8 as j,p as C,q as w,r as P,v as U,D as _,ah as N,bW as K,O as X,s as $,F as x,G as H,T as W,bX as G,bt as J,P as Y}from"./.pnpm-BGZW0UGg.js";import{u as Z,e as Q,p as z,R as L,i as E,_ as ee}from"./index-CTzEhZ24.js";import{j as re,k as ae}from"./file-BQ0rU-P3.js";const te=5*1024*1024,se=3;function le(e,r){const s=(r.name.split(".").pop()||"mp4").toLowerCase(),S=Date.now(),h=Math.random().toString(36).slice(2,10);return`${e}${S}-${h}.${s}`}async function ce(e){var o,d;const r=await re({type:e.type});if(r.fallback)throw((o=e.onFallback)==null?void 0:o.call(e,r.provider))??!1?new T(r.provider):new T(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 s=r.credentials,S=r.expired_time??0,h=r.start_time??Math.floor(Date.now()/1e3),y=new I({getAuthorization(m,i){i({TmpSecretId:s.tmpSecretId,TmpSecretKey:s.tmpSecretKey,SecurityToken:s.sessionToken,StartTime:h,ExpiredTime:S})}}),p=le(r.key_prefix,e.file);await new Promise((m,i)=>{y.uploadFile({Bucket:r.bucket,Region:r.region,Key:p,Body:e.file,SliceSize:te,AsyncLimit:se,onProgress(f){if(!e.onProgress)return;const b=f.total||e.file.size;e.onProgress({percent:Math.min(99,Math.round((f.percent||0)*100)),loaded:f.loaded||0,total:b,speed:f.speed||0})}},f=>{if(f){i(f);return}m()})});const u=await ae({type:e.type,key:p,name:e.file.name,size:e.file.size,content_type:e.file.type||"",cid:e.cid??0});return(d=e.onProgress)==null||d.call(e,{percent:100,loaded:e.file.size,total:e.file.size,speed:0}),u}class T extends Error{constructor(s){super(`COS 直传不可用,当前驱动: ${s}`);D(this,"provider");this.name="DirectUploadFallbackError",this.provider=s}}const ne=V({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 s=Z(),S=Q(),h=j(),y=k(`${z.baseUrl}${z.urlPrefix}/upload/${e.type}`),p=C(()=>({token:s.token,version:S.config.version})),u=k(!1),o=k([]),d=C(()=>e.direct&&["video","voice"].includes(e.type)),m=()=>{u.value=!0};let i=0;const f=(a,c)=>{i++,i==o.value.length&&(i=0,o.value=[],r("allSuccess")),r("change",c),a.code==L.SUCCESS&&r("success",a),a.code==L.FAIL&&a.msg&&E.msgError(a.msg)},b=(a,c)=>{var l;i++,i==o.value.length&&(i=0,o.value=[],r("allSuccess")),E.msgError(`${c.name}文件上传失败`),(l=h.value)==null||l.abort(c),u.value=!1,r("change",c),r("error",c)},B=()=>{E.msgError(`超出上传上限${e.limit},请重新上传`)},F=()=>{o.value=[],u.value=!1},O=C(()=>{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";default:return"*"}}),R=async a=>{var c,l,v;u.value=!0;try{const t=await ce({file:a.file,type:e.type,cid:Number(((c=a.data)==null?void 0:c.cid)??0),onProgress(n){var g;(g=a.onProgress)==null||g.call(a,{percent:n.percent,loaded:n.loaded,total:n.total})}});(l=a.onSuccess)==null||l.call(a,{code:L.SUCCESS,msg:"ok",data:t})}catch(t){if(t instanceof T){E.msgWarning("当前存储不支持直传,已切换为普通上传"),await A(a);return}(v=a.onError)==null||v.call(a,t instanceof Error?t:new Error(String((t==null?void 0:t.message)??t)))}},A=a=>new Promise(c=>{const l=new XMLHttpRequest;l.open("POST",y.value),Object.entries(p.value).forEach(([t,n])=>l.setRequestHeader(t,String(n??""))),l.upload.onprogress=t=>{var g;if(!t.lengthComputable)return;const n=t.loaded/t.total*100;(g=a.onProgress)==null||g.call(a,{percent:n,loaded:t.loaded,total:t.total})},l.onload=()=>{var t,n;try{const g=JSON.parse(l.responseText);(t=a.onSuccess)==null||t.call(a,g)}catch{(n=a.onError)==null||n.call(a,new Error("上传响应解析失败"))}c()},l.onerror=()=>{var t;(t=a.onError)==null||t.call(a,new Error("网络错误")),c()};const v=new FormData;v.append("file",a.file),Object.entries(a.data||{}).forEach(([t,n])=>v.append(t,String(n))),l.send(v)});return{uploadRefs:h,action:y,headers:p,visible:u,fileList:o,useDirect:d,httpRequest:R,getAccept:O,handleProgress:m,handleSuccess:f,handleError:b,handleExceed:B,handleClose:F}}}),oe={class:"upload"},de={class:"file-list p-4"},ie={class:"flex-1"};function ue(e,r,s,S,h,y){const p=K,u=G,o=J;return w(),P("div",oe,[U(p,{"file-list":e.fileList,"onUpdate:fileList":r[0]||(r[0]=d=>e.fileList=d),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:_(()=>[N(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(),X(o,{key:0,modelValue:e.visible,"onUpdate:modelValue":r[1]||(r[1]=d=>e.visible=d),title:"上传进度","close-on-click-modal":!1,width:"500px",modal:!1,onClose:e.handleClose},{default:_(()=>[$("div",de,[(w(!0),P(x,null,H(e.fileList,(d,m)=>(w(),P("div",{key:m,class:"mb-5"},[$("div",null,W(d.name),1),$("div",ie,[U(u,{percentage:parseInt(d.percentage)},null,8,["percentage"])])]))),128))])]),_:1},8,["modelValue","onClose"])):Y("",!0)])}const pe=ee(ne,[["render",ue]]);export{pe as U};
|