PageSourceSearch

https://www.11xyz.com/assets/UploadVideo-CZVDSgpR.js

js 11xyz.com collected 2026-10-08 22:43:31 UTC 16,509 bytes, 1 lines download raw bytes

1import{a5 as ie,r as $,h as T,y as we,E as ye,H as A,u as Ve,g as Ee,q as he,U as ze,o as Ie,j as B,b,c as N,d as h,l as R,w as L,k as ee,f as q,B as Pe,t as Z,e as W,F as ge,m as $e,n as X,bS as Ce,Q as Re,bT as Fe,bU as Me,a0 as Ne}from"./index-CIzLHlU0.js";import{m as Ae}from"./md5-C0dF_Xz-.js";import{O as Oe}from"./UploadVideoForm.vue_vue_type_style_index_0_scoped_34265b81_lang-BdRRLVpu.js";import{g as le}from"./utils-CVoYL1nk.js";import{t as ne}from"./creative-Ch2S6ScD.js";import{_ as De}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./_commonjs-dynamic-modules-TDtrdbi3.js";import"./function-SmlKWHSm.js";const Y=(o,z)=>{for(const g of z){const a=o[g];if(a!=null&&a!=="")return a}};function Be(o){return o.startsWith("oss-")?o:`oss-${o}`}function _e(o={}){const z=Y(o,["accessKeyId","access_key_id"]),g=Y(o,["accessKeySecret","access_key_secret"]),a=Y(o,["securityToken","stsToken","security_token","sts_token"]),C=Y(o,["bucket","bucketName","bucket_name"]),l=Y(o,["endpoint","ossEndpoint","oss_endpoint"]);if(!z||!g)throw new Error("OSS 初始化缺少 STS 凭证");const f={accessKeyId:z,accessKeySecret:g,stsToken:a,bucket:C},m=Be(o.region);if(f.region=m,l&&(f.endpoint=l),!f.region&&!f.endpoint)throw new Error("OSS 初始化缺少 region / endpoint");return new Oe(f)}function Le(o){return(Array.isArray(o)?o:o&&typeof o=="object"?[o]:[]).map(g=>({number:Number(g.number??g.PartNumber??0),etag:g.etag??g.ETag??""}))}const ue="h5/ossUpload/";function je(o){return ie.post(`${ue}initUpload`,o)}function He(o){return ie.get(`${ue}refreshSts/${o}`)}function Ke(o){return ie.post(`${ue}complete`,o)}const Ge=2*1024*1024*1024,qe=5*1024*1024,Ze=3,We=5*60*1e3,Qe=100*1024;function Xe(o={}){const{maxSize:z=Ge,partSize:g=qe,concurrency:a=Ze,onSuccess:C}=o,l=$(null),f=$(!1);let m=null,d=!1,F=0;const G=T(()=>!!l.value&&!f.value&&l.value.status!=="success"),Q=T(()=>{var s;return f.value?"上传中...":((s=l.value)==null?void 0:s.status)==="error"?"重试上传":"开始上传"}),i=T(()=>{var t;const s=(t=l.value)==null?void 0:t.status;if(s==="success")return"success";if(s==="error")return"exception"}),y=()=>{var s;(s=l.value)!=null&&s.objectUrl&&URL.revokeObjectURL(l.value.objectUrl)};we(()=>{d=!0,y()});const k=s=>s.type.startsWith("video/")?s.size>z?(ye.error(`视频大小不能超过 ${(z/1024/1024/1024).toFixed(2)}GB`),!1):(y(),l.value={file:s,name:s.name,size:s.size,objectUrl:URL.createObjectURL(s),fileHash:"",material_id:0,uploadId:"",ossPath:"",status:"idle",progress:0,statusText:""},!0):(ye.error("请选择视频文件"),!1),I=()=>{if(f.value){A.warning("上传中,无法删除");return}y(),l.value=null},u=()=>{y(),l.value=null,m=null,F=0,d=!1},w=(s,t)=>new Promise((n,v)=>{const U=Math.ceil(s.size/2097152)||1,O=Ae.create(),j=new FileReader;let H=0;const K=()=>{const c=H*2097152,S=Math.min(c+2097152,s.size);j.readAsArrayBuffer(s.slice(c,S))};j.onload=c=>{var D;const S=(D=c.target)==null?void 0:D.result;if(!S)return v(new Error("读取文件失败"));O.update(S),H++,t==null||t(Math.round(H/U*100)),H<U?K():n(O.hex())},j.onerror=()=>v(new Error("读取文件失败")),K()}),_=async()=>{const s=l.value;if(!s||Date.now()<F-We)return;console.log("[useVideoUpload] STS 即将过期,正在刷新...");const t=await He(s.material_id);if(t.statusCode!==200||!t.data)throw new Error(t.msg||"刷新 STS 失败");t.data.ossPath&&t.data.ossPath!==s.ossPath&&console.warn("[useVideoUpload] refreshSts 返回了不同的 ossPath,仍沿用原路径以保证分片会话一致:",t.data.ossPath),t.data.uploadId&&t.data.uploadId!==s.uploadId&&console.warn("[useVideoUpload] refreshSts 返回了不同的 uploadId,仍沿用原 uploadId 以保证分片会话一致:",t.data.uploadId),s.material_id=t.data.material_id,F=new Date(t.data.expiration).getTime(),m=_e(t.data)},x=async()=>{const s=l.value;if(!s||!m)throw new Error("OSS 客户端未初始化");const t=Math.max(g,Qe),n=Math.ceil(s.size/t)||1;s.statusText="查询已上传分片...";let v=[];try{const c=await m.listParts(s.ossPath,s.uploadId);v=Le(c.parts)}catch(c){console.warn("[useVideoUpload] listParts 失败,将从头开始:",c)}const P=new Set(v.map(c=>c.number)),U=[];for(let c=1;c<=n;c++)P.has(c)||U.push(c);s.progress=Math.round(v.length/n*100),s.statusText=`上传中 ${v.length}/${n}...`;const O=[...v];let j=0;const H=async()=>{for(;j<U.length;){if(d)return;const c=U[j++];await _();const S=(c-1)*t,D=Math.min(S+t,s.size),se=await m.uploadPart(s.ossPath,s.uploadId,c,s.file,S,D);O.push({number:c,etag:se.etag}),s.progress=Math.round(O.length/n*100),s.statusText=`上传中 ${O.length}/${n}...`}};if(await Promise.all(Array.from({length:Math.min(a,U.length||1)},()=>H())),d)throw new Error("cancelled");s.statusText="正在合并分片...";const K=O.sort((c,S)=>c.number-S.number).filter((c,S,D)=>!S||c.number!==D[S-1].number);if(K.length!==n)throw new Error(`分片不完整(${K.length}/${n})`);await m.completeMultipartUpload(s.ossPath,s.uploadId,K)},te=async(s={})=>{const t=l.value;if(!t)return A.warning("请先选择视频"),!1;if(f.value)return!1;if(t.status==="success")return!0;d=!1,f.value=!0;try{if(t.fileHash||(t.status="hashing",t.statusText="正在计算文件哈希...",t.fileHash=await w(t.file,U=>{t.progress=Math.round(U*.05),t.statusText=`正在计算文件哈希... ${U}%`})),d)throw new Error("cancelled");t.statusText="正在初始化上传...";const n=await je({file_name:t.name,file_hash:t.fileHash,...s});if(n.statusCode!==200)throw new Error(n.msg||"初始化上传失败");const v=n.data;if(d)throw new Error("cancelled");if(t.material_id=v.material_id,v.upload_status===1)return t.status="success",t.progress=100,t.statusText="秒传成功",A.success("秒传成功"),J(),!0;if(!v.uploadId||!v.ossPath||!v.accessKeyId)throw new Error("初始化返回缺少 uploadId / ossPath / STS");if(t.uploadId=v.uploadId,t.ossPath=v.ossPath,F=new Date(v.expiration).getTime(),m=_e(v),t.status="uploading",t.statusText="上传中...",await x(),d)throw new Error("cancelled");t.statusText="正在通知服务器...";const P=await Ke({file_hash:t.fileHash});if(P.statusCode!==200)throw new Error(P.msg||"通知后端失败");return t.status="success",t.progress=100,t.statusText="上传完成",A.success("视频上传成功"),J(),!0}catch(n){return d?(console.log("[useVideoUpload] 上传已取消"),!1):(console.error("[useVideoUpload] 失败:",n),t.status="error",t.error=(n==null?void 0:n.message)||"未知错误",t.statusText=`上传失败:${t.error}`,A.error("上传失败,请重试"),!1)}finally{f.value=!1}},J=()=>{setTimeout(()=>{C==null||C()},500)};return{video:l,uploading:f,canUpload:G,actionText:Q,progressStatus:i,addVideo:k,removeVideo:I,upload:te,cancel:async()=>
1{if(!f.value)return;d=!0;const s=l.value;if(s!=null&&s.uploadId&&(s!=null&&s.ossPath)&&m)try{await m.abortMultipartUpload(s.ossPath,s.uploadId)}catch(t){console.warn("[useVideoUpload] OSS abort 失败:",t)}},reset:()=>{l.value&&(l.value.status="idle",l.value.progress=0,l.value.statusText="",l.value.error=void 0)},clear:u}}const Ye={class:"material-wrap"},Je={class:"material-wrap-scrollbar"},et={key:0,class:"material-files form-shadow material-files-single"},tt={class:"material-files-item"},st={class:"file-cover"},at=["src"],ot={class:"file-title"},rt=["title"],lt={key:0,class:"file-size"},nt={class:"material-tip"},it={key:0,class:"video-progress"},ut={class:"progress-text"},ct={__name:"UploadVideoForm",props:{source:{type:String,default:""},folders:{type:Array,default:null},creativeType:{type:String,default:""},id:{type:Number,default:0},maxSize:{type:Number,default:void 0},partSize:{type:Number,default:void 0},concurrency:{type:Number,default:void 0},inline:{type:Boolean,default:!1}},emits:["success","close","busy"],setup(o,{expose:z,emit:g}){const a=o,C=g,l=Ve(),f=Ee(),m=T(()=>l.query.institution),d=$(),F=$(),G=$([]),Q=T(()=>{var e;return(e=a.folders)!=null&&e.length?a.folders:G.value}),i=he({group_id:void 0,title:"",content:"",category_id:null}),y=T(()=>!!a.creativeType),k=T(()=>!!a.id),I=T(()=>{var e;return a.creativeType&&((e=ne[a.creativeType])==null?void 0:e.name)||"视频"}),u=he({src:"",size:0}),w=$(!1),{video:_,uploading:x,progressStatus:te,addVideo:J,removeVideo:ce,upload:de,cancel:s,clear:t}=Xe({maxSize:a.maxSize,partSize:a.partSize,concurrency:a.concurrency}),n=T(()=>x.value||w.value);ze(n,e=>C("busy",e));const v=T(()=>{var e;return n.value?k.value?"保存中...":"上传中...":!k.value&&((e=_.value)==null?void 0:e.status)==="error"?"重试上传":k.value?"保存":"开始上传"}),P=T(()=>{if(k.value)return u.src?{src:u.src,name:i.title||I.value,sizeText:u.size?U(u.size):""}:null;const e=_.value;return e?{src:e.objectUrl,name:e.name,sizeText:U(e.size)}:null}),U=e=>e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:e<1024*1024*1024?`${(e/1024/1024).toFixed(2)} MB`:`${(e/1024/1024/1024).toFixed(2)} GB`,O=(e,r,p)=>{if(k.value||_.value)return p();p(new Error("请选择视频"))},j=T(()=>({...y.value?{title:[{required:!0,message:`请输入${I.value}名称`,trigger:"blur"}]}:{},file:[{validator:O,trigger:"change"}]})),H=()=>new Promise(e=>{if(!d.value)return e(!0);d.value.validate(r=>e(!!r))}),K=()=>{var e;return(e=F.value)==null?void 0:e.click()},c=e=>{var V,M;const r=e.target,p=(V=r.files)==null?void 0:V[0];r.value="",p&&J(p)&&((M=d.value)==null||M.validateField("file"))},S=()=>{var e;ce(),(e=d.value)==null||e.validateField("file")},D=$([]),se=async()=>{var p;const e=a.creativeType;if(!e)return;const{data:r}=await Ce({institution_id:m.value,category:(p=ne[e])==null?void 0:p.type,is_user:1});D.value=r||[]},Se=async()=>{var e;if(!((e=a.folders)!=null&&e.length||y.value))try{const r=le(a.source)||{},p=await f.dispatch("common/GET_MATERIAL_GROUP_LIST",{source:r,is_user:a.source==="person"?0:1});G.value=p||[]}catch(r){console.error("[UploadVideoForm] 获取文件夹列表失败:",r)}},pe=e=>{e&&(i.title=e.title||"",i.content=e.content||"",i.category_id=e.category_id??null,u.src=Re(e.url||""),u.size=e.size||0)},fe=async(e,r)=>{if(!e)return A.error("素材信息保存失败:缺少素材 ID"),!1;const p=new FormData;p.append("id",String(e)),p.append("is_creation","1"),p.append("title",i.title),p.append("content",i.content||""),p.append("drafts",String(r)),i.category_id&&p.append("category_id",String(i.category_id));const V=le(a.source)||{};Object.entries(V).forEach(([oe,re])=>{p.append(oe,String(re))});const{msg:M}=await Fe(p);return A.success(M),!0},ae=e=>{window.setTimeout(()=>C("success",e),500)},ve=async(e=2)=>{var V;if(n.value||!await H())return;if(k.value){w.value=!0;try{await fe(a.id,e)&&ae(e)}catch(M){console.error("[UploadVideoForm] 保存素材信息失败:",M)}finally{w.value=!1}return}const r=le(a.source)||{};if(await de({drafts:e,...i,...r})){if(!y.value)return ae(e);w.value=!0;try{await fe(((V=_.value)==null?void 0:V.material_id)||0,e)&&ae(e)}catch(M){console.error("[UploadVideoForm] 保存素材信息失败:",M),A.warning("视频已上传,但素材信息保存失败,请在列表中重新编辑")}finally{w.value=!1}}},be=async()=>{x.value&&await s(),C("close")},me=()=>{var e;t(),i.group_id=void 0,i.title="",i.content="",i.category_id=null,(e=d.value)==null||e.clearValidate()},Te=async(e=0)=>x.value?(A.warning("正在上传中,请稍候"),!1):(me(),await Se(),i.group_id=e||void 0,!0);return Ie(()=>{se(),pe()}),we(()=>{t()}
1),z({open:Te,reset:me,getDetail:pe,cancelUpload:s}),(e,r)=>{const p=B("el-input"),V=B("el-form-item"),M=B("el-cascader"),oe=B("el-progress"),re=B("el-option"),ke=B("el-select"),xe=B("el-form"),Ue=B("el-scrollbar");return b(),N("div",{class:X(["video-upload",{"is-page":o.inline}])},[h("input",{ref_key:"fileInputRef",ref:F,type:"file",style:{display:"none"},accept:"video/*",onInput:c},null,544),R(Ue,{class:X(["video-upload-scroll",o.inline?"page-top-border":""])},{default:L(()=>[R(xe,{ref_key:"ruleFormRef",ref:d,"label-width":"80px",model:i,rules:j.value},{default:L(()=>[y.value?(b(),ee(V,{key:0,label:`${I.value}名称`,prop:"title"},{default:L(()=>[R(p,{class:"ui-input",modelValue:i.title,"onUpdate:modelValue":r[0]||(r[0]=E=>i.title=E),placeholder:`请输入${I.value}名称`,disabled:n.value},null,8,["modelValue","placeholder","disabled"])]),_:1},8,["label"])):q("",!0),y.value?q("",!0):(b(),ee(V,{key:1,label:"文件夹"},{default:L(()=>[R(M,{class:"ui-input",modelValue:i.group_id,"onUpdate:modelValue":r[1]||(r[1]=E=>i.group_id=E),style:{width:"100%"},options:Q.value,props:{checkStrictly:!0,value:"id",label:"group_name",children:"children",emitPath:!1},placeholder:"请选择文件夹",clearable:"",disabled:n.value},null,8,["modelValue","options","disabled"])]),_:1})),R(V,{label:"上传视频",prop:"file"},{default:L(()=>[h("div",Ye,[h("div",Je,[P.value?(b(),N("div",et,[h("div",tt,[!n.value&&!k.value?(b(),N("div",{key:0,class:"file-remove",onClick:Pe(S,["stop"])},r[6]||(r[6]=[h("i",{class:"viconfont vi-times"},null,-1)]))):q("",!0),h("div",st,[h("video",{src:P.value.src,controls:""},null,8,at)]),h("div",ot,[h("p",{title:P.value.name},Z(P.value.name),9,rt),P.value.sizeText?(b(),N("p",lt,Z(P.value.sizeText),1)):q("",!0)])])])):(b(),N("div",{key:1,class:"material-upload form-shadow",onClick:K},r[7]||(r[7]=[h("div",{class:"icon fvc"},[h("i",{class:"viconfont vi-plus"})],-1),h("p",null,"点击选择视频",-1)])))]),h("div",nt,Z(k.value?"编辑模式下仅支持修改素材信息,如需更换视频请删除后重新上传":"视频大小建议 2G 以内,支持断点续传"),1),!k.value&&W(_)&&W(_).status!=="idle"?(b(),N("div",it,[R(oe,{percentage:W(_).progress,status:W(te),"stroke-width":8},null,8,["percentage","status"]),h("div",ut,Z(W(_).statusText),1)])):q("",!0)])]),_:1}),y.value?(b(),N(ge,{key:2},[R(V,{label:`${I.value}介绍`},{default:L(()=>[R(p,{class:"ui-input",type:"textarea",modelValue:i.content,"onUpdate:modelValue":r[2]||(r[2]=E=>i.content=E),placeholder:`请输入${I.value}介绍`,disabled:n.value},null,8,["modelValue","placeholder","disabled"])]),_:1},8,["label"]),R(V,{label:`${I.value}分类`,prop:"category_id"},{default:L(()=>[R(ke,{class:"ui-input",modelValue:i.category_id,"onUpdate:modelValue":r[3]||(r[3]=E=>i.category_id=E),placeholder:`请选择${I.value}分类`,clearable:"",disabled:n.value},{default:L(()=>[(b(!0),N(ge,null,$e(D.value,E=>(b(),ee(re,{key:E.id,label:E.name,value:E.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue","placeholder","disabled"])]),_:1},8,["label"])],64)):q("",!0)]),_:1},8,["model","rules"])]),_:1},8,["class"]),h("div",{class:X(["fvc gap-x-12",y.value?"py-20":"pb-20"])},[h("div",{class:X(["ui-button",n.value?"disabled":"add"]),onClick:r[4]||(r[4]=E=>ve(2))},Z(v.value),3),y.value?(b(),N("div",{key:0,class:X(["ui-button",n.value?"disabled":""]),onClick:r[5]||(r[5]=E=>ve(1))}," 保存到草稿箱 ",2)):(b(),N("div",{key:1,class:"ui-button",onClick:be},Z(W(x)?"取消上传":"取消"),1))],2)],2)}}},dt=De(ct,[["__scopeId","data-v-34265b81"]]),wt={__name:"UploadVideo",props:{source:{type:String,default:""},folders:{type:Array,default:null},creativeType:{type:String,default:""},id:{type:Number,default:0},maxSize:{type:Number,default:void 0},partSize:{type:Number,default:void 0},concurrency:{type:Number,default:void 0},title:{type:String,default:"上传视频"}},emits:["success"],setup(o,{expose:z,emit:g}){const a=o,C=g,l=$(),f=$(!1),m=$(!1),d=$(0),F=$(a.title),G=T(()=>{var u;return((u=ne[a.creativeType])==null?void 0:u.name)||"视频"}),Q=T(()=>({source:a.source,folders:a.folders,creativeType:a.creativeType,id:d.value,maxSize:a.maxSize,partSize:a.partSize,concurrency:a.concurrency})),i=async(u=null,w=0)=>{var _,x;if(m.value){A.warning("正在上传中,请稍候");return}d.value=(u==null?void 0:u.id)||0,F.value=d.value?`修改${G.value}
1`:a.title,f.value=!0,await Ne(),(_=l.value)==null||_.open(w),d.value&&((x=l.value)==null||x.getDetail(u))},y=async()=>{var u;await((u=l.value)==null?void 0:u.cancelUpload()),f.value=!1},k=()=>{var u;d.value=0,(u=l.value)==null||u.reset()},I=u=>{f.value=!1,C("success",u)};return z({open:i,close:y}),(u,w)=>{const _=B("el-dialog");return b(),ee(_,{modelValue:f.value,"onUpdate:modelValue":w[1]||(w[1]=x=>f.value=x),width:"500px",top:"10vh","custom-class":"ui-dialog","append-to-body":"","close-on-click-modal":!1,"close-on-press-escape":!m.value,"show-close":!m.value,title:F.value,onClosed:k},{default:L(()=>[R(dt,Me({ref_key:"formRef",ref:l},Q.value,{onSuccess:I,onClose:y,onBusy:w[0]||(w[0]=x=>m.value=x)}),null,16)]),_:1},8,["modelValue","close-on-press-escape","show-close","title"])}}};export{wt as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.