Files
2026-07-08 14:46:39 +08:00

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