UNPKG

@jecloud/utils

Version:

JECloud 工具库

5 lines 15.3 kB
/** * @license MIT * https://github.com/flowjs/flow.js */ var e=window.navigator.msPointerEnabled;function t(e){if(this.support=!("undefined"==typeof File||"undefined"==typeof Blob||"undefined"==typeof FileList||!Blob.prototype.slice&&!Blob.prototype.webkitSlice&&!Blob.prototype.mozSlice),this.support){this.supportDirectory=/Chrome/.test(window.navigator.userAgent)||/Firefox/.test(window.navigator.userAgent)||/Edge/.test(window.navigator.userAgent),this.files=[],this.defaults={chunkEnable:!1,chunkSize:1048576,forceChunkSize:!1,simultaneousUploads:3,singleFile:!1,fileParameterName:"file",progressCallbacksInterval:500,speedSmoothingFactor:.1,query:{},headers:{},withCredentials:!1,preprocess:null,changeRawDataBeforeSend:null,method:"multipart",testMethod:"GET",uploadMethod:"POST",prioritizeFirstAndLastChunk:!1,allowDuplicateUploads:!1,target:"/",testChunks:!0,generateUniqueIdentifier:null,maxChunkRetries:0,chunkRetryInterval:null,permanentErrors:[404,413,415,500,501],successStatuses:[200,201,202],onDropStopPropagation:!1,initFileFn:null,readFileFn:s},this.opts={},this.events={};var i=this;this.onDrop=function(e){i.opts.onDropStopPropagation&&e.stopPropagation(),e.preventDefault();var t=e.dataTransfer;t.items&&t.items[0]&&t.items[0].webkitGetAsEntry?i.webkitReadDataTransfer(e):i.addFiles(t.files,e)},this.preventEvent=function(e){e.preventDefault()},this.opts=t.extend({},this.defaults,e||{})}}function i(e,t,i){this.flowObj=e,this.bytes=null,this.file=t,this.name=t.fileName||t.name,this.size=t.size,this.relativePath=t.relativePath||t.webkitRelativePath||this.name,this.uniqueIdentifier=void 0===i?e.generateUniqueIdentifier(t):i,this.chunkEnable=!1,this.chunkSize=0,this.chunks=[],this.paused=!1,this.error=!1,this.averageSpeed=0,this.currentSpeed=0,this._lastProgressCallback=Date.now(),this._prevUploadedSize=0,this._prevProgress=0,this.bootstrap()}function s(e,t,i,s,n){var r="slice";e.file.slice?r="slice":e.file.mozSlice?r="mozSlice":e.file.webkitSlice&&(r="webkitSlice"),n.readFinished(e.file[r](t,i,s))}function n(e,t,i){this.flowObj=e,this.fileObj=t,this.offset=i,this.tested=!1,this.retries=0,this.pendingRetry=!1,this.preprocessState=0,this.readState=0,this.loaded=0,this.total=0,this.chunkSize=this.fileObj.chunkSize,this.startByte=this.offset*this.chunkSize,this.filename=null,this.computeEndByte=function(){var e=Math.min(this.fileObj.size,(this.offset+1)*this.chunkSize);return this.fileObj.size-e<this.chunkSize&&!this.flowObj.opts.forceChunkSize&&(e=this.fileObj.size),e},this.endByte=this.computeEndByte(),this.xhr=null;var s=this;this.event=function(e,t){(t=Array.prototype.slice.call(arguments)).unshift(s),s.fileObj.chunkEvent.apply(s.fileObj,t)},this.progressHandler=function(e){e.lengthComputable&&(s.loaded=e.loaded,s.total=e.total),s.event("progress",e)},this.testHandler=function(e){var t=s.status(!0);"error"===t?(s.event(t,s.message()),s.flowObj.uploadNextChunk()):"success"===t?(s.tested=!0,s.event(t,s.message()),s.flowObj.uploadNextChunk()):s.fileObj.paused||(s.tested=!0,s.send())},this.doneHandler=function(e){var t=s.status();if("success"===t||"error"===t)delete this.data,s.event(t,s.message()),s.flowObj.uploadNextChunk();else if(!s.fileObj.paused){s.event("retry",s.message()),s.pendingRetry=!0,s.abort(),s.retries++;var i=s.flowObj.opts.chunkRetryInterval;null!==i?setTimeout((function(){s.send()}),i):s.send()}}}function r(e,t){var i=e.indexOf(t);i>-1&&e.splice(i,1)}function o(e,t){return"function"==typeof e&&(t=Array.prototype.slice.call(arguments),e=e.apply(null,t.slice(1))),e}function h(e,t){setTimeout(e.bind(t),0)}function a(e,t){return l(arguments,(function(t){t!==e&&l(t,(function(t,i){e[i]=t}))})),e}function l(e,t,i){var s;if(e)if(void 0!==e.length){for(s=0;s<e.length;s++)if(!1===t.call(i,e[s],s))return}else for(s in e)if(e.hasOwnProperty(s)&&!1===t.call(i,e[s],s))return}t.prototype={on:function(e,t){e=e.toLowerCase(),this.events.hasOwnProperty(e)||(this.events[e]=[]),this.events[e].push(t)},off:function(e,t){void 0!==e?(e=e.toLowerCase(),void 0!==t?this.events.hasOwnProperty(e)&&r(this.events[e],t):delete this.events[e]):this.events={}},fire:function(e,t){t=Array.prototype.slice.call(arguments),e=e.toLowerCase();var i=!1;return this.events.hasOwnProperty(e)&&l(this.events[e],(function(e){i=!1===e.apply(this,t.slice(1))||i}),this),"catchall"!=e&&(t.unshift("catchAll"),i=!1===this.fire.apply(this,t)||i),!i},webkitReadDataTransfer:function(e){var t=this,i=e.dataTransfer.items.length,s=[];function n(e){e.readEntries((function(t){t.length?(i+=t.length,l(t,(function(e){if(e.isFile){var t=e.fullPath;e.file((function(e){r(e,t)}),o)}else e.isDirectory&&n(e.createReader())})),n(e)):h()}),o)}function r(e,t){e.relativePath=t.substring(1),s.push(e),h()}function o(e){throw h(),e}function h(){0==--i&&t.addFiles(s,e)}l(e.dataTransfer.items,(function(e){var t=e.webkitGetAsEntry();t?t.isFile?r(e.getAsFile(),t.fullPath):n(t.createReader()):h()}))},generateUniqueIdentifier:function(e){var t=this.opts.generateUniqueIdentifier;if("function"==typeof t)return t(e);var i=e.relativePath||e.webkitRelativePath||e.fileName||e.name;return e.size+"-"+i.replace(/[^0-9a-zA-Z_-]/gim,"")},uploadNextChunk:function(e){var t=!1;if(this.opts.prioritizeFirstAndLastChunk&&(l(this.files,(function(e){return!e.paused&&e.chunks.length&&"pending"===e.chunks[0].status()?(e.chunks[0].send(),t=!0,!1):!e.paused&&e.chunks.length>1&&"pending"===e.chunks[e.chunks.length-1].status()?(e.chunks[e.chunks.length-1].send(),t=!0,!1):void 0})),t))return t;if(l(this.files,(function(e){if(e.paused||l(e.chunks,(function(e){if("pending"===e.status())return e.send(),t=!0,!1})),t)return!1})),t)return!0;var i=!1;return l(this.files,(function(e){if(!e.isComplete())return i=!0,!1})),i||e||h((function(){this.fire("complete")}),this),!1},assignBrowse:function(e,t,i,s){e instanceof Element&&(e=[e]),l(e,(function(e){var n;"INPUT"===e.tagName&&"file"===e.type?n=e:((n=document.createElement("input")).setAttribute("type","file"),a(n.style,{visibility:"hidden",position:"absolute",width:"1px",height:"1px"}),e.appendChild(n),e.addEventListener("click",(function(){n.click()}),!1)),this.opts.singleFile||i||n.setAttribute("multiple","multiple"),t&&n.setAttribute("webkitdirectory","webkitdirectory"),l(s,(function(e,t){n.setAttribute(t,e)}));var r=this;n.addEventListener("change",(function(e){e.target.value&&(r.addFiles(e.target.files,e),e.target.value="")}),!1)}),this)},assignDrop:function(e){void 0===e.length&&(e=[e]),l(e,(function(e){e.addEventListener("dragover",this.preventEvent,!1),e.addEventListener("dragenter",this.preventEvent,!1),e.addEventListener("drop",this.onDrop,!1)}),this)},unAssignDrop:function(e){void 0===e.length&&(e=[e]),l(e,(function(e){e.removeEventListener("dragover",this.preventEvent),e.removeEventListener("dragenter",this.preventEvent),e.removeEventListener("drop",this.onDrop)}),this)},isUploading:function(){var e=!1;return l(this.files,(function(t){if(t.isUploading())return e=!0,!1})),e},_shouldUploadNext:function(){var e=0,t=!0,i=this.opts.simultaneousUploads;return l(this.files,(function(s){l(s.chunks,(function(s){if("uploading"===s.status()&&++e>=i)return t=!1,!1}))})),t&&e},upload:function(){var e=this._shouldUploadNext();if(!1!==e){this.fire("uploadStart");for(var t=!1,i=1;i<=this.opts.simultaneousUploads-e;i++)t=this.uploadNextChunk(!0)||t;t||h((function(){this.fire("complete")}),this)}},resume:function(){l(this.files,(function(e){e.isComplete()||e.resume()}))},pause:function(){l(this.files,(function(e){e.pause()}))},cancel:function(){for(var e=this.files.length-1;e>=0;e--)this.files[e].cancel()},progress:function(){var e=0,t=0;return l(this.files,(function(i){e+=i.progress()*i.size,t+=i.size})),t>0?e/t:0},addFile:function(e,t){this.addFiles([e],t)},addFiles:function(t,s){var n=[];l(t,(function(t){if((!e||e&&t.size>0)&&(t.size%4096!=0||"."!==t.name&&"."!==t.fileName)){var r=this.generateUniqueIdentifier(t);if(this.opts.allowDuplicateUploads||!this.getFromUniqueIdentifier(r)){var o=new i(this,t,r);this.fire("fileAdded",o,s)&&n.push(o)}}}),this),this.fire("filesAdded",n,s)&&(l(n,(function(e){this.opts.singleFile&&this.files.length>0&&this.removeFile(this.files[0]),this.files.push(e)}),this),this.fire("filesSubmitted",n,s))},removeFile:function(e){for(var t=this.files.length-1;t>=0;t--)this.files[t]===e&&(this.files.splice(t,1),e.abort(),this.fire("fileRemoved",e))},getFromUniqueIdentifier:function(e){var t=!1;return l(this.files,(function(i){i.uniqueIdentifier===e&&(t=i)})),t},getSize:function(){var e=0;return l(this.files,(function(t){e+=t.size})),e},sizeUploaded:function(){var e=0;return l(this.files,(function(t){e+=t.sizeUploaded()})),e},timeRemaining:function(){var e=0,t=0;return l(this.files,(function(i){i.paused||i.error||(e+=i.size-i.sizeUploaded(),t+=i.averageSpeed)})),e&&!t?Number.POSITIVE_INFINITY:e||t?Math.floor(e/t):0}},i.prototype={measureSpeed:function(){var e=Date.now()-this._lastProgressCallback;if(e){var t=this.flowObj.opts.speedSmoothingFactor,i=this.sizeUploaded();this.currentSpeed=Math.max((i-this._prevUploadedSize)/e*1e3,0),this.averageSpeed=t*this.currentSpeed+(1-t)*this.averageSpeed,this._prevUploadedSize=i}},chunkEvent:function(e,t,i){switch(t){case"progress":if(Date.now()-this._lastProgressCallback<this.flowObj.opts.progressCallbacksInterval)break;this.measureSpeed(),this.flowObj.fire("fileProgress",this,e),this.flowObj.fire("progress"),this._lastProgressCallback=Date.now();break;case"error":this.error=!0,this.abort(!0),this.flowObj.fire("fileError",this,i,e),this.flowObj.fire("error",i,this,e);break;case"success":if(this.error)return;this.measureSpeed(),this.flowObj.fire("fileProgress",this,e),this.flowObj.fire("progress"),this._lastProgressCallback=Date.now(),this.isComplete()&&(this.currentSpeed=0,this.averageSpeed=0,this.flowObj.fire("fileSuccess",this,i,e));break;case"retry":this.flowObj.fire("fileRetry",this,e)}},pause:function(){this.paused=!0,this.abort()},resume:function(){this.paused=!1,this.flowObj.upload()},abort:function(e){this.currentSpeed=0,this.averageSpeed=0;var t=this.chunks;e&&(this.chunks=[]),l(t,(function(e){"uploading"===e.status()&&(e.abort(),this.flowObj.uploadNextChunk())}),this)},cancel:function(){this.flowObj.removeFile(this)},retry:function(){this.bootstrap(),this.flowObj.upload()},bootstrap:function(){"function"==typeof this.flowObj.opts.initFileFn&&this.flowObj.opts.initFileFn(this),this.abort(!0),this.error=!1,this._prevProgress=0;var e=this.flowObj.opts.forceChunkSize?Math.ceil:Math.floor;this.chunkSize=o(this.flowObj.opts.chunkSize,this),this.chunkEnable=o(this.flowObj.opts.chunkEnable,this);for(var t=this.chunkEnable?Math.max(e(this.size/this.chunkSize),1):1,i=0;i<t;i++)this.chunks.push(new n(this.flowObj,this,i))},progress:function(){if(this.error)return 1;if(1===this.chunks.length)return this._prevProgress=Math.max(this._prevProgress,this.chunks[0].progress()),this._prevProgress;var e=0;l(this.chunks,(function(t){e+=t.progress()*(t.endByte-t.startByte)}));var t=e/this.size;return this._prevProgress=Math.max(this._prevProgress,t>.9999?1:t),this._prevProgress},isUploading:function(){var e=!1;return l(this.chunks,(function(t){if("uploading"===t.status())return e=!0,!1})),e},isComplete:function(){var e=!1;return l(this.chunks,(function(t){var i=t.status();if("pending"===i||"uploading"===i||"reading"===i||1===t.preprocessState||1===t.readState)return e=!0,!1})),!e},sizeUploaded:function(){var e=0;return l(this.chunks,(function(t){e+=t.sizeUploaded()})),e},timeRemaining:function(){if(this.paused||this.error)return 0;var e=this.size-this.sizeUploaded();return e&&!this.averageSpeed?Number.POSITIVE_INFINITY:e||this.averageSpeed?Math.floor(e/this.averageSpeed):0},getType:function(){return this.file.type&&this.file.type.split("/")[1]},getExtension:function(){return this.name.substr(2+(~-this.name.lastIndexOf(".")>>>0)).toLowerCase()}},n.prototype={getParams:function(){return this.chunkEnable?{flowChunkNumber:this.offset+1,flowChunkSize:this.chunkSize,flowChunkEnable:this.chunkEnable,flowCurrentChunkSize:this.endByte-this.startByte,flowTotalSize:this.fileObj.size,flowIdentifier:this.fileObj.uniqueIdentifier,flowFilename:this.fileObj.name,flowRelativePath:this.fileObj.relativePath,flowTotalChunks:this.fileObj.chunks.length}:{}},getTarget:function(e,t){return 0==t.length?e:(e.indexOf("?")<0?e+="?":e+="&",e+t.join("&"))},test:function(){this.xhr=new XMLHttpRequest,this.xhr.addEventListener("load",this.testHandler,!1),this.xhr.addEventListener("error",this.testHandler,!1);var e=o(this.flowObj.opts.testMethod,this.fileObj,this),t=this.prepareXhrRequest(e,!0);this.xhr.send(t)},preprocessFinished:function(){this.endByte=this.computeEndByte(),this.preprocessState=2,this.send()},readFinished:function(e){this.readState=2,this.bytes=e,this.send()},send:function(){var e=this.flowObj.opts.preprocess,t=this.flowObj.opts.readFileFn;if("function"==typeof e)switch(this.preprocessState){case 0:return this.preprocessState=1,void e(this);case 1:return}switch(this.readState){case 0:return this.readState=1,void(this.chunkEnable?t(this.fileObj,this.startByte,this.endByte,this.fileObj.file.type,this):this.readFinished(this.fileObj.file));case 1:return}if(!this.flowObj.opts.testChunks||this.tested){this.loaded=0,this.total=0,this.pendingRetry=!1,this.xhr=new XMLHttpRequest,this.xhr.upload.addEventListener("progress",this.progressHandler,!1),this.xhr.addEventListener("load",this.doneHandler,!1),this.xhr.addEventListener("error",this.doneHandler,!1);var i=o(this.flowObj.opts.uploadMethod,this.fileObj,this),s=this.prepareXhrRequest(i,!1,this.flowObj.opts.method,this.bytes),n=this.flowObj.opts.changeRawDataBeforeSend;"function"==typeof n&&(s=n(this,s)),this.xhr.send(s)}else this.test()},abort:function(){var e=this.xhr;this.xhr=null,e&&e.abort()},status:function(e){return 1===this.readState?"reading":this.pendingRetry||1===this.preprocessState?"uploading":this.xhr?this.xhr.readyState<4?"uploading":this.flowObj.opts.successStatuses.indexOf(this.xhr.status)>-1?"success":this.flowObj.opts.permanentErrors.indexOf(this.xhr.status)>-1||!e&&this.retries>=this.flowObj.opts.maxChunkRetries?"error":(this.abort(),"pending"):"pending"},message:function(){return this.xhr?this.xhr.responseText:""},progress:function(){if(this.pendingRetry)return 0;var e=this.status();return"success"===e||"error"===e?1:"pending"===e?0:this.total>0?this.loaded/this.total:0},sizeUploaded:function(){var e=this.endByte-this.startByte;return"success"!==this.status()&&(e=this.progress()*e),e},prepareXhrRequest:function(e,t,i,s){var n=o(this.flowObj.opts.query,this.fileObj,this,t);n=a(n||{},this.getParams());var r=o(this.flowObj.opts.target,this.fileObj,this,t),h=null;if("GET"===e||"octet"===i){var u=[];l(n,(function(e,t){u.push([encodeURIComponent(t),encodeURIComponent(e)].join("="))})),r=this.getTarget(r,u),h=s||null}else h=new FormData,l(n,(function(e,t){h.append(t,e)})),void 0!==s&&h.append(this.flowObj.opts.fileParameterName,this.fileObj.file,this.filename||this.fileObj.file.name);return this.xhr.open(e,r,!0),this.xhr.withCredentials=this.flowObj.opts.withCredentials,l(o(this.flowObj.opts.headers,this.fileObj,this,t),(function(e,t){this.xhr.setRequestHeader(t,e)}),this),h}},t.evalOpts=o,t.extend=a,t.each=l,t.FlowFile=i,t.FlowChunk=n,t.version="@flowjs/flow.js@2.14.1";export default t;