2 lines
3.9 KiB
JavaScript
2 lines
3.9 KiB
JavaScript
"use strict";const e=require("../common/vendor.js"),t=require("../request/request.js"),r=require("../request/api.js"),i=require("./watermark.js");async function n(t){const i=function(e){var t;if(!e)return"";const r=String(e).split("?")[0],i=(null==(t=r.split(".").pop())?void 0:t.toLowerCase())||"";return!i||i.length>8||!1===r.endsWith(i)?"jpg":i}(t),n=await function(t){return new Promise((r=>{e.index.getFileInfo({filePath:t,digestAlgorithm:"md5",success:e=>r((e.digest||"").toLowerCase()),fail:e=>{console.warn("getFileMd5 fail, use empty:",e),r("")}})}))}(t);return function(e){if(!e)throw new Error("七牛凭证为空");const t=e.token||e.uploadToken||e.uptoken,r=e.key||e.fileKey||e.objectKey,i=(e.uploadUrl||e.uploadHost||e.host||"https://upload.qiniup.com").replace(/\/$/,""),n=String(e.url||e.fileUrl||e.fullUrl||"").trim();let a=(e.domain||e.cdnDomain||"").replace(/\/$/,"");if(!a&&n){const e=n.match(/^(https?:\/\/[^/]+)/i);e&&(a=e[1])}a&&!a.startsWith("http")&&(a=`https://${a}`);if(!t||!r)throw new Error("七牛凭证缺少 token 或 key");return{token:t,key:r,uploadUrl:i,cdnOrigin:a,presetUrl:n}}((await r.getQiniuUploadToken({fileMd5:n,suffix:i})).data)}function a(e,t){if(e.presetUrl)return e.presetUrl;let r=e.key;if(t)try{const e="string"==typeof t?JSON.parse(t):t;(null==e?void 0:e.key)&&(r=e.key)}catch(i){}return e.cdnOrigin&&r?`${e.cdnOrigin}/${String(r).replace(/^\//,"")}`:function(e,t){if(!e||!t)return"";const r=String(t).replace(/^\//,""),i=String(e).replace(/\/$/,"");if(i.startsWith("http://")||i.startsWith("https://"))return`${i}/${r}`;return`https://${i}/${r}`}(e.cdnOrigin,r)}async function s(t,r={}){let i=t;r.beforeUpload&&(i=await r.beforeUpload(t));const s=await n(i),{token:o,key:l,uploadUrl:u}=s;return new Promise(((t,r)=>{e.index.uploadFile({url:u,filePath:i,name:"file",formData:{token:o,key:l},success:e=>{if(e.statusCode&&e.statusCode>=400)return void r(new Error(`七牛上传失败(${e.statusCode})`));const i=a(s,e.data);if(!i)return void r(new Error("无法解析上传后的文件地址,请检查后端 url 或 CDN 配置"));let n=l;try{const t="string"==typeof e.data?JSON.parse(e.data):e.data;(null==t?void 0:t.key)&&(n=t.key)}catch(o){}t({url:i,key:n,filePath:i,serverPath:i})},fail:e=>{console.error("七牛上传失败:",e),r(e)}})}))}function o(e){if(!e)return"";const r=String(e);return r.startsWith("http://")||r.startsWith("https://")?r:t.toImageUrl(r)}exports.buildAttachmentItem=function(e,t={}){var r;const i=o(e.serverPath||e.filePath||e.url||"");return{fileName:e.name||(i?null==(r=i.split("/").pop())?void 0:r.split("?")[0]:"")||""||t.fileName||"",filePath:i,fileType:e.type||t.fileType||"image/jpeg",fileSize:e.size||t.fileSize||0}},exports.createUploadListHandlers=function(t,r={}){return{afterRead:async n=>{const a=[].concat(n.file);let o=t.value.length;a.forEach((e=>{t.value.push({...e,status:"uploading",message:"上传中"})}));for(let u=0;u<a.length;u++){const n=o;try{const e=r.watermark?e=>i.addTimestampWatermark({tempFilePath:e,...r.watermark}):void 0,o=await s(a[u].url,{beforeUpload:e}),l=t.value[n];t.value.splice(n,1,{...l,status:"success",message:"",url:o.url,serverPath:o.url})}catch(l){console.error("上传失败:",l);const r=t.value[n];t.value.splice(n,1,{...r,status:"failed",message:(null==l?void 0:l.msg)||(null==l?void 0:l.message)||"上传失败"}),e.index.showToast({title:(null==l?void 0:l.msg)||(null==l?void 0:l.message)||"上传失败",icon:"none"})}o++}},deletePic:e=>{t.value.splice(e.index,1)}}},exports.mapServerFileToUploadItem=function(e){const t=o(e.filePath||e.url||"");return{url:t,serverPath:t,status:"success",message:"",name:e.fileName||e.name||"",type:e.fileType||"image/jpeg",size:e.fileSize||0}},exports.toSubmitFileUrl=o,exports.uploadSingleWithLoading=function(t,r={}){const i=r.loadingTitle||"上传中...";return e.index.showLoading({title:i,mask:!0}),s(t,r).then((t=>(e.index.hideLoading(),t))).catch((t=>{throw e.index.hideLoading(),t}))},exports.uploadToCloud=s;
|