my-uniapp-tools
Version:
一个简洁稳定的 uni-app 开发工具库,提供剪贴板、本地存储、导航、系统信息等常用功能
2 lines (1 loc) • 3.08 kB
JavaScript
import{MESSAGES as e}from"./constants.js";import{normalizeHeaders as s,normalizeFormData as t,serializeFormDataValue as n,safeJsonParse as o,normalizeExtensions as i,isBlobUrl as c,revokeObjectURLSafely as a,getExtension as r,createFileId as l}from"./utils.js";function u(s){const{type:t="image",count:n=1,extensions:o}=s;return new Promise(s=>{if("undefined"==typeof document||"undefined"==typeof window)return void s({success:!1,files:[],message:e.ENV_NOT_SUPPORT_SELECT});const c=document.createElement("input");c.type="file",c.multiple=n>1,c.style.display="none";const a=i(o);"image"===t?c.accept="image/*":a&&(c.accept=a.map(e=>`.${e}`).join(","));let u=!1,f=null;const m=e=>{u||(u=!0,(()=>{f&&(clearTimeout(f),f=null),window.removeEventListener("focus",p);try{c.remove()}catch{}})(),s(e))},d=s=>{if(!s||0===s.length)return void m({success:!1,files:[],message:e.USER_CANCELED});const t=Array.from(s).slice(0,n).map((e,s)=>({id:l(s),name:e.name,size:e.size,path:URL.createObjectURL(e),mimeType:e.type,ext:r(e.name),source:"file",platform:"h5",raw:e}));m({success:!0,files:t})};c.addEventListener("change",()=>d(c.files)),c.addEventListener("cancel",()=>m({success:!1,files:[],message:e.USER_CANCELED}));const p=()=>{u||(f=window.setTimeout(()=>{u||(c.files&&0!==c.files.length?d(c.files):m({success:!1,files:[],message:e.USER_CANCELED}))},300))};window.addEventListener("focus",p),document.body.appendChild(c),c.click()})}function f(i,r,l){const{fieldName:u="file",formData:f,headers:m,timeoutMs:d,autoRevokeObjectURL:p}=r,{signal:E,onProgress:L}=r,g="string"==typeof u&&u.trim()?u:"file",v="number"==typeof d&&Number.isFinite(d)&&d>0?d:void 0,y=s(m),C=t(f),D="function"==typeof L?L:void 0;return new Promise(s=>{const t=i.raw;if(!("undefined"!=typeof File&&t&&t instanceof File))return void s({file:i,success:!1,message:e.H5_FILE_MISSING});const r=new XMLHttpRequest;let u=!1,f=null;const m=e=>{u||(u=!0,E&&f&&"function"==typeof E.removeEventListener&&(E.removeEventListener("abort",f),f=null),p&&c(i.path)&&a(i.path),s(e))};if(E&&"function"==typeof E.addEventListener){if(E.aborted)return void m({file:i,success:!1,message:e.UPLOAD_CANCELED});f=()=>{r.abort(),m({file:i,success:!1,message:e.UPLOAD_CANCELED})},E.addEventListener("abort",f,{once:!0})}r.open("POST",l),v&&v>0&&(r.timeout=v),y&&Object.keys(y).forEach(e=>{r.setRequestHeader(e,y[e])});const d=new FormData;d.append(g,t,i.name),C&&Object.keys(C).forEach(e=>{d.append(e,n(C[e]))}),r.upload.onprogress=e=>{if(e.lengthComputable&&D){const s=Math.round(e.loaded/e.total*100);D(i,s)}},r.onload=()=>{const s=r.status,t=s>=200&&s<300;let n=o(r.responseText);m({file:i,success:t,statusCode:s,data:n,message:t?void 0:e.STATUS_CODE_ERROR(s)})},r.onerror=()=>m({file:i,success:!1,message:e.UPLOAD_FAILED}),r.ontimeout=()=>m({file:i,success:!1,message:e.UPLOAD_TIMEOUT(v||0)}),r.onabort=()=>m({file:i,success:!1,message:e.UPLOAD_CANCELED});try{r.send(d)}catch(s){const t=s instanceof Error?s.message:"Unknown error";m({file:i,success:!1,message:e.UPLOAD_REQUEST_FAILED(t)})}})}export{u as pickFilesInH5,f as uploadFileInH5};