2 lines
4.3 KiB
JavaScript
2 lines
4.3 KiB
JavaScript
(function(n,s){if(typeof module=="object"&&module.exports){module.exports=s(n);return}n.UploadPages=s(n),n.document&&n.document.addEventListener("DOMContentLoaded",function(){n.UploadPages.init()})})(typeof globalThis!="undefined"?globalThis:window,function(n){"use strict";var s=n.document,T=4*1024*1024,h={};function m(e){var t=e||{},r=t.ossId;return{ossId:r==null?"":String(r),fileName:t.fileName||t.originalName||"",url:t.url||""}}function U(e,t){return(e||"文件")+(t?" 上传完成":" 上传失败")}function N(){return"resumable"}function R(){return n.GenealogyApi&&n.GenealogyApi.defaultClient}function k(e,t){var r=t&&(t.status||t.code);return!e||!e.getToken||!e.getToken()||Number(r)===401}function I(e,t){return k(e,t)?(e&&e.clearToken&&e.clearToken(),n.NavigationUtil.open("login.html"),!0):!1}function g(e){return Number(e&&(e.status||e.code))===403}function w(e,t){return(t||s).querySelector(e)}function E(e,t){return Array.prototype.slice.call((t||s).querySelectorAll(e))}function v(e,t,r){if(e){if(e.setAttribute("role","status"),e.setAttribute("aria-live","polite"),t&&n.ProfileUI&&n.ProfileUI.setApiState){n.ProfileUI.setApiState(e,t,r);return}e.textContent=r||""}}function x(e){if(n.layui&&n.layui.layer){n.layui.layer.msg(e);return}n.alert&&n.alert(e)}function B(){return n.crypto&&typeof n.crypto.randomUUID=="function"?"pc-"+n.crypto.randomUUID():"pc-"+Date.now()+"-"+Math.random().toString(16).slice(2)}function F(e){var t=new Uint8Array(e),r=[],a;for(a=0;a<t.length;a+=8192)r.push(String.fromCharCode.apply(null,t.subarray(a,a+8192)));return r.join("")}async function A(e){var t;if(!e||typeof e.arrayBuffer!="function")throw new Error("当前浏览器无法读取文件");if(typeof n.hex_md5!="function")throw new Error("缺少文件 MD5 组件");return t=await e.arrayBuffer(),n.hex_md5(F(t))}async function L(e,t){for(var r=0;;)try{return await e()}catch(a){if(r>=t)throw a;r+=1}}async function D(e,t,r){var a=r||{},u=a.chunkSize||T,c=Math.ceil(t.size/u),l=a.hashBlob||A,o=await l(t),i={uploadId:a.uploadId||B(),fileName:t.name,fileMd5:o,totalSize:t.size,totalChunks:c,chunkSize:u,contentType:t.type||"application/octet-stream"},d=await e.initResumableUpload(i),y=Array.isArray(d&&d.uploadedChunks)?d.uploadedChunks.slice():[],z={},b,f;if(d&&d.instant)return m(d);for(b=d&&d.uploadId||i.uploadId,y.forEach(function(p){z[Number(p)]=!0}),a.onProgress&&a.onProgress({uploadedChunks:y.length,totalChunks:c}),f=0;f<c;f+=1)z[f]||await(async function(p){var M=p*u,P=t.slice(M,Math.min(M+u,t.size)),G=await l(P);await L(function(){return e.uploadResumableChunk({uploadId:b,chunkIndex:p,chunkMd5:G,file:P})},a.maxRetries===void 0?2:a.maxRetries),y.push(p),a.onProgress&&a.onProgress({uploadedChunks:y.length,totalChunks:c})})(f);return m(await e.completeResumableUpload({uploadId:b,fileName:t.name,fileMd5:o,totalSize:t.size,totalChunks:c}))}function C(e,t,r){var a,u;return!e||!t||!t.name||!Number(t.size)?Promise.reject(new Error("请选择文件")):(a=[t.name,t.size,t.lastModified||0].join(":"),h[a]?h[a]:(u=D(e,t,r).finally(function(){delete h[a]}),h[a]=u,u))}function S(e,t,r){var a=String(e||"").trim(),u=String(t||"").trim();return!r||!a?u:a.split(",").concat(u).filter(Boolean).join(",")}async function j(e){var t=R(),r=Array.prototype.slice.call(e.files||[]),a=w(e.getAttribute("data-upload-target")),u=w(e.getAttribute("data-upload-status")),c=e.getAttribute("data-upload-multiple")==="true",l,o;if(!(!r.length||!a||I(t))){e.disabled=!0;try{for(o=0;o<r.length;o+=1){if(v(u,"loading",r[o].name+" 正在上传…"),l=m(await C(t,r[o],{onProgress:function(i){v(u,"loading","正在上传 "+i.uploadedChunks+"/"+i.totalChunks+" 分片")}})),!l.ossId)throw new Error("上传响应缺少 ossId");a.value=S(a.value,l.ossId,c),v(u,"",U(l.fileName||r[o].name,l.ossId))}}catch(i){if(I(t,i))return;v(u,g(i)?"forbidden":"error",g(i)?"当前账号无权上传文件。":i.message||"上传失败"),x(g(i)?"当前账号无权上传文件。":i.message||"上传失败")}finally{e.disabled=!1,e.value=""}}}function q(){s&&s.addEventListener("change",function(e){var t=e.target.closest("[data-upload-target]");!t||t.type!=="file"||j(t)})}function _(){E("[data-upload-status]").forEach(function(e){e.setAttribute("role","status"),e.setAttribute("aria-live","polite")}),q()}return{normalizeUploadResult:m,buildUploadStatus:U,getUploadMode:N,hashBlob:A,uploadFileForPage:C,mergeUploadTargetValue:S,shouldRedirectToLogin:k,isForbidden:g,init:_}});
|