UNPKG

@fesjs/fes-design

Version:
90 lines (87 loc) 2.34 kB
import { hasOwn } from '../_util/utils'; function getError(action, option, xhr) { let msg; if (xhr.response) { msg = `${xhr.response.error || xhr.response}`; } else if (xhr.responseText) { msg = `${xhr.responseText}`; } else { msg = `fail to post ${action} ${xhr.status}`; } const err = new Error(msg); err.status = xhr.status; err.method = 'post'; err.url = action; return err; } function getBody(xhr) { const text = xhr.responseText || xhr.response; if (!text) { return text; } try { return JSON.parse(text); } catch (e) { return text; } } function upload(option) { if (typeof XMLHttpRequest === 'undefined') { return; } const xhr = new XMLHttpRequest(); const action = option.action; if (xhr.upload) { xhr.upload.onprogress = function progress(e) { if (e.total > 0) { e.percent = e.loaded / e.total * 100; } option.onProgress(e); }; } const formData = new FormData(); if (option.data) { Object.keys(option.data).forEach(key => { formData.append(key, option.data[key]); }); } formData.append(option.fileName, option.file, option.file.name); xhr.onerror = function error() { option.onError(getError(action, option, xhr)); }; xhr.onload = function onload() { if (xhr.status < 200 || xhr.status >= 300) { return option.onError(getError(action, option, xhr)); } if (option.transformResponse) { try { option.onSuccess(option.transformResponse(xhr)); } catch (e) { const msg = (e === null || e === void 0 ? void 0 : e.message) || `fail to post ${action} ${xhr.status}`; const err = new Error(msg); err.status = xhr.status; err.method = 'post'; err.url = action; option.onError(err); } } else { option.onSuccess(getBody(xhr)); } }; xhr.open('post', action, true); if (option.withCredentials && 'withCredentials' in xhr) { xhr.withCredentials = true; } if (option.timeout) { xhr.timeout = option.timeout; } const headers = option.headers || {}; Object.keys(headers).forEach(item => { if (hasOwn(headers, item) && headers[item] !== null) { xhr.setRequestHeader(item, headers[item]); } }); xhr.send(formData); return xhr; } export { upload as default };