vod-sdk-upload.min.js
13.3 KB
"use strict";(function(){function n(e){if(!e)return;this._config={chunkSize:1048576};if(this._config.chunkSize&&this._config.chunkSize<102400)return;t(this._config,e);if(!this._config.aliyunCredential&&!this._config.stsToken)return;if(!this._config.endpoint)return;var n=window.ALY;this._config.stsToken?this.oss=new n.OSS({accessKeyId:this._config.stsToken.Credentials.AccessKeyId,secretAccessKey:this._config.stsToken.Credentials.AccessKeySecret,securityToken:this._config.stsToken.Credentials.SecurityToken,endpoint:this._config.endpoint,apiVersion:"2013-10-15"}):this.oss=new n.OSS({accessKeyId:this._config.aliyunCredential.accessKeyId,secretAccessKey:this._config.aliyunCredential.secretAccessKey,endpoint:this._config.endpoint,apiVersion:"2013-10-15"}),this._uploadInfo={},this._uploadInfo.state=undefined}var e=function(){var e=4,t=document.createElement("div"),n=t.getElementsByTagName("i");while(t.innerHTML="<!--[if gt IE "+e+"]><i></i><![endif]-->",n[0])e++;return e>4?e:!1},t=function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&t[n]&&(e[n]=t[n])};n.prototype.cancelUpload=function(){var e=this,t=e._uploadInfo.multipartMap,n={Bucket:e._config.bucket,Key:e._uploadInfo.key,UploadId:e._uploadInfo.uploadId};if(e._uploadInfo.state=="uploaded")return;e._uploadInfo.state="cancel",t={Parts:[]},e._uploadInfo.chunksNum>1&&e.oss.abortMultipartUpload(n,function(t,n){if(t){typeof e._callback.onerror=="function"&&e._callback.onerror(t);return}})},n.prototype.init=function(e){var t=e.onerror,n=this._config.errors;if(!e){typeof t=="function"&&t(n.format(n.CODE.NullValue,n.MESSAGE.NullValue,"options"));return}if(!e.file){typeof e.onerror=="function"&&t(n.format(n.CODE.NullValue,n.MESSAGE.NullValue,"file"));return}if(!e.key){typeof e.onerror=="function"&&t(n.format(n.CODE.NullValue,n.MESSAGE.NullValue,"key"));return}e.key=e.key.replace(new RegExp("^/"),""),this._callback={},this._callback.onerror=e.onerror,this._callback.oncomplete=e.oncomplete,this._callback.onprogress=e.onprogress,this._uploadInfo.file=e.file,this._uploadInfo.blobSlice=File.prototype.slice||File.prototype.mozSlice||File.prototype.webkitSlice,this._uploadInfo.chunksNum=Math.ceil(e.file.size/this._config.chunkSize),this._uploadInfo.currentChunk=0,this._uploadInfo.uploadId=undefined,this._uploadInfo.type=undefined,this._uploadInfo.multipartMap={Parts:[]},this._uploadInfo.connum=0,this._uploadInfo.key=e.key,this._uploadInfo.state="init"},n.prototype.oncomplete=function(){typeof this._callback.oncomplete=="function"&&this._callback.oncomplete(this._uploadInfo.uploadId)},n.prototype.onprogress=function(){var e=this,t=e._uploadInfo.multipartMap;if(typeof this._callback.onprogress=="function"){var n=0;for(var r in t.Parts)n+=t.Parts[r].loaded;e._callback.onprogress({loaded:n,total:this._uploadInfo.file.size})}},n.prototype.onUploadSingle=function(e,t){var n=this,r=this._uploadInfo,i=n._callback.onerror;if(e){if(typeof n._callback.onerror=="function"&&e){e.code=="NetworkingError"?setTimeout(function(){n.uploadSingle()},2e3):(r.state="interrupt",i(e,t));return}return}typeof n._callback.oncomplete=="function"&&(n._uploadInfo.state="uploaded",n._callback.oncomplete(t))},n.prototype.onUploadPart=function(e,t,n){var r=this,i=this._uploadInfo,s=r._uploadInfo.multipartMap;if(r._uploadInfo.state=="cancel")return;r._uploadInfo.connum--;if(t){if(t.code=="NetworkingError")s.Parts[e].loaded=0,setTimeout(function(){r.uploadPart(e)},2e3);else{if(t.code=="SecurityTokenExpired"||t.code=="InvalidAccessKeyId")if(r._uploadInfo.state=="interrupt")return;i.state="interrupt",r._callback.onerror(t,n)}return}s.Parts[e].ETag=n.ETag,s.Parts[e].loaded=s.Parts[e].data.byteLength,delete s.Parts[e].data,i.currentChunk<i.chunksNum?r.loadChunk():r._uploadInfo.connum==0&&s.Parts.length==i.chunksNum&&(r._uploadInfo.state="partuploaded",r.completeMultipartUpload())},n.prototype.onMultiUploadComplete=function(e,t){var n=this;if(e){if(typeof n._callback.onerror=="function"){e?e.code=="NetworkingError"?setTimeout(function(){n.completeMultipartUpload()},2e3):n._callback.onerror(e):console.log("onMultiUploadComplete: error msg is null.");return}return}typeof n._callback.oncomplete=="function"&&(n._uploadInfo.state="uploaded",n._callback.oncomplete(t))},n.prototype.uploadSingle=function(){var e=this,t=e._uploadInfo.multipartMap,n={Bucket:e._config.bucket,Key:e._uploadInfo.key,Body:t.Parts[0].data,ContentType:e._uploadInfo.file.type||""};e._uploadInfo.state="uploading";var r=e.oss.putObject(n,function(t,n){e.onUploadSingle(t,n)});r.on("httpUploadProgress",function(t){typeof e._callback.onprogress=="function"&&e._callback.onprogress({loaded:t.loaded,total:e._uploadInfo.file.size})})},n.prototype.createMultipartUpload=function(){var e=this,t=e._callback.onerror,n={Bucket:e._config.bucket,Key:e._uploadInfo.key,ContentType:e._uploadInfo.file.type||""};e._uploadInfo.state="start",e.oss.createMultipartUpload(n,function(n,r){if(n){n.code=="NetworkingError"?setTimeout(function(){e.createMultipartUpload()},2e3):t(n);return}e._uploadInfo.uploadId=r.UploadId;while(e._uploadInfo.connum<e._config.concurrency)e.uploadPart(e._uploadInfo.connum)})},n.prototype.uploadPart=function(e){var t=this,n=t._uploadInfo.multipartMap,r={Body:n.Parts[e].data,Bucket:t._config.bucket,Key:t._uploadInfo.key,PartNumber:String(e+1),UploadId:t._uploadInfo.uploadId};t._uploadInfo.state="uploading",t._uploadInfo.connum++;var i=t.oss.uploadPart(r,function(n,r){t.onUploadPart(e,n,r)});i.on("httpUploadProgress",function(r){n.Parts[e].loaded=r.loaded,t.onprogress()})},n.prototype.completeMultipartUpload=function(){var e=this,t=e._uploadInfo.multipartMap;for(var n in t.Parts)t.Parts[n].loaded&&delete t.Parts[n].loaded;var r={Bucket:e._config.bucket,Key:e._uploadInfo.key,CompleteMultipartUpload:t,UploadId:e._uploadInfo.uploadId};this.oss.completeMultipartUpload(r,function(t,n){e.onMultiUploadComplete(t,n)})},n.prototype.loadChunk=function(){var e=this,t=e._uploadInfo,n=e._config,r=t.currentChunk,i=new FileReader;i.onload=function(t){e.frOnload(r,t)},i.onerror=function(t){e.frOnerror(r,t)};var s=r*n.chunkSize,o=s+n.chunkSize>=t.file.size?t.file.size:s+n.chunkSize,u=t.blobSlice.call(t.file,s,o);i.readAsArrayBuffer(u),t.currentChunk++},n.prototype.frOnload=function(e,t){var n=this,r=n._uploadInfo,i=n._config;r.multipartMap.Parts[e]={data:t.target.result,PartNumber:e+1,loaded:0},r.chunksNum==1?n.uploadSingle():r.multipartMap.Parts.length<i.concurrency?n.loadChunk():n._uploadInfo.state=="init"?n.createMultipartUpload():n.uploadPart(e)},n.prototype.frOnerror=function(e,t){var n=this,r=n._callback.onerror,i=n._config.errors,s=n._uploadInfo;typeof r=="function"&&r(i.format(i.CODE.ReadFileError,i.MESSAGE.ReadFileError,s.file.name,e))},n.prototype.resumeUploadWithToken=function(e,t,n){var r=this,i=r._uploadInfo.multipartMap;r._config.stsToken.Credentials.AccessKeyId=e,r._config.stsToken.Credentials.AccessKeySecret=t,r._config.stsToken.Credentials.SecurityToken=n;var s=window.ALY;r._config.stsToken?r.oss=new s.OSS({accessKeyId:r._config.stsToken.Credentials.AccessKeyId,secretAccessKey:r._config.stsToken.Credentials.AccessKeySecret,securityToken:r._config.stsToken.Credentials.SecurityToken,endpoint:r._config.endpoint,apiVersion:"2013-10-15"}):r.oss=new s.OSS({accessKeyId:r._config.aliyunCredential.accessKeyId,secretAccessKey:r._config.aliyunCredential.secretAccessKey,endpoint:r._config.endpoint,apiVersion:"2013-10-15"});if(r._uploadInfo.state=="start")r.createMultipartUpload();else if(r._uploadInfo.state=="interrupt")if(r._uploadInfo.chunksNum==1)r.uploadSingle();else for(var o in i.Parts)i.Parts[o].data&&r.uploadPart(parseInt(o));else r._uploadInfo.state=="partuploaded"&&r.completeMultipartUpload()},n.prototype.upload=function(){var e=this,t=e._callback.onerror,n=e._config.errors,r=e._uploadInfo,i=e._config;e.loadChunk()},window.OssUpload=n})();var VODUploadError={CODE:{SUCCESS:"Successful",EmptyValue:"InvalidParameter.EmptyValue",STSInvalid:"InvalidParameter.TokenInvalid",ReadFileError:"ReadFileError",FILEDUPLICATION:"FileDuplication",UploadALEADRYSTARTED:"UploadAlearyStarted"},MESSAGE:{SUCCESS:"Successful",EmptyValue:"参数 {0} 不能为空。",STSInvalid:"STS参数非法, accessKeyId、accessKeySecret、secretToken、expireTime都不能为空。",ReadFileError:"读取文件{0}{1}失败.",FILEDUPLICATION:"文件重复添加 {0}",UploadALEADRYSTARTED:"重复开始."},format:function(e){if(arguments.length<2)return null;var t=arguments[1];for(var n=1;n<arguments.length;n++){var r=new RegExp("\\{"+(n-1)+"\\}","gm");t=t.replace(r,arguments[n+1])}return{code:e,message:t}}},VODUpload=function(e){this.options=e,this.initialize()};VODUpload.UPLOADSTATE={INIT:"Ready",UPLOADING:"Uploading",SUCCESS:"Success",FAIlURE:"Failure",CANCELED:"Canceled"},VODUpload.prototype={constructor:VODUpload,initialize:function(){this.options.uploadList=[],this.options.oss=new Object,this.options.curObject=undefined,this.options.isRunning=!1},init:function(e,t,n,r){if(!e){var i=VODUploadError.format(VODUploadError.CODE.EmptyValue,VODUploadError.MESSAGE.EmptyValue,"accessKeyId");throw new Error(i.message)}if(!t){var i=VODUploadError.format(VODUploadError.CODE.EmptyValue,VODUploadError.MESSAGE.EmptyValue,"accessKeySecret");throw new Error(i.message)}if(n&&!r||!n&&r){var i=VODUploadError.format(VODUploadError.CODE.STSInvalid,VODUploadError.MESSAGE.STSInvalid,n,r);throw new Error(i.message)}var s=this.options;return s.oss.accessKeyId=e,s.oss.accessKeySecret=t,s.oss.securityToken=n,s.oss.expireTime=r,!0},addFile:function(e,t,n,r){if(!e){var i=VODUploadError.format(VODUploadError.CODE.EmptyValue,VODUploadError.MESSAGE.EmptyValue,"file");throw new Error(i.message)}if(!t){var i=VODUploadError.format(VODUploadError.CODE.EmptyValue,VODUploadError.MESSAGE.EmptyValue,"endpoint");throw new Error(i.message)}if(!n){var i=VODUploadError.format(VODUploadError.CODE.EmptyValue,VODUploadError.MESSAGE.EmptyValue,"bucket");throw new Error(i.message)}if(!r){var i=VODUploadError.format(VODUploadError.CODE.EmptyValue,VODUploadError.MESSAGE.EmptyValue,"key");throw new Error(i.message)}var s=this.options;for(var o=0;o<s.uploadList.length;o++)if(s.uploadList[o].file.name==e.name){var i=VODUploadError.format(VODUploadError.CODE.FILEDUPLICATION,VODUploadError.MESSAGE.FILEDUPLICATION,e.name);throw new Error(i.message)}var u=new Object;u.file=e,u.endpoint=t,u.bucket=n,u.key=r,u.state=VODUpload.UPLOADSTATE.INIT;var a=this;return u.reload=function(){this.state==VODUpload.UPLOADSTATE.CANCELED&&(this.state=VODUpload.UPLOADSTATE.INIT),a.options.curObject=undefined,a.startUpload()},u.cancel=function(){a.cancelFile(u.file.name)},a.options.uploadList.push(u),!0},cancelFile:function(e){var t=this.options;if(!e)throw new Error("文件名不能为空。");for(var n=0;n<t.uploadList.length;n++)if(t.uploadList[n].file.name==e){switch(t.uploadList[n].state){case VODUpload.UPLOADSTATE.UPLOADING:t.uploadList[n].state=VODUpload.UPLOADSTATE.CANCELED,this.options.ossUpload.cancelUpload(),this.nextUpload();break;case VODUpload.UPLOADSTATE.SUCCESS:throw new Error("文件已上传完成,无法删除。");case VODUpload.UPLOADSTATE.CANCELED:throw new Error("文件已经取消上传。");default:t.uploadList[n].state=VODUpload.UPLOADSTATE.CANCELED}return!0}throw new Error("删除的文件不存在。")},listFiles:function(){return this.options.uploadList},startUpload:function(){var e=this.options;if(this.options.isRunning)return;var t=0;if(e.curObject==e.uploadList[e.uploadList.length-1]){this.options.isRunning=!1;return}e.curObject=undefined;for(;t<e.uploadList.length;t++)if(e.uploadList[t].state==VODUpload.UPLOADSTATE.INIT){e.curObject=e.uploadList[t];break}if(!e.curObject)return;e.curObject.state=VODUpload.UPLOADSTATE.UPLOADING;var n=e.curObject.endpoint||"http://oss-cn-hangzhou.aliyuncs.com",r;e.oss.securityToken?r=new OssUpload({bucket:e.curObject.bucket,endpoint:n,chunkSize:1048576,concurrency:1,errors:VODUploadError,stsToken:{Credentials:{AccessKeyId:e.oss.accessKeyId,AccessKeySecret:e.oss.accessKeySecret,SecurityToken:e.oss.securityToken}}}):r=new OssUpload({bucket:e.curObject.bucket,endpoint:n,chunkSize:1048576,concurrency:1,errors:VODUploadError,aliyunCredential:{accessKeyId:e.oss.accessKeyId,secretAccessKey:e.oss.accessKeySecret}}),e.ossUpload=r;var i=this;r.init({file:e.curObject.file,key:e.curObject.key,maxRetry:3,onerror:function(t){t.code=="SecurityTokenExpired"||t.code=="InvalidAccessKeyId"?e.onUploadTokenExpired&&e.onUploadTokenExpired(i):(e.curObject.state=VODUpload.UPLOADSTATE.FAIlURE,e.onUploadFailed&&e.onUploadFailed(e.curObject.file.name,"1",""),e.isRunning=!1)},oncomplete:function(t){e.curObject.state=VODUpload.UPLOADSTATE.SUCCESS,e.onUploadSucceed&&e.onUploadSucceed(e.curObject.file.name),setTimeout(function(){i.nextUpload()},100)},onprogress:function(t){e.onUploadProgress&&e.onUploadProgress(e.curObject.file.name,t.total,t.loaded)}}),r.upload(),this.options.isRunning=!0},nextUpload:function(){this.options.isRunning=!1,this.startUpload()},clear:function(e){var t=this.options,n=0;for(var r=0;r<t.uploadList.length;r++)t.uploadList[r].state==VODUpload.UPLOADSTATE.SUCCESS&&n++,t.uploadList[r].state==e&&(t.uploadList.splice(r,1),r--);t.onClear&&t.onClear(t.uploadList.length,n)},stopUpload:function(){if(!this.options.isRunning)return;this.options.ossUpload.cancelUpload(),this.options.isRunning=!1},resumeUploadWithToken:function(e,t,n,r){var i=this.options;if(!e||!t||!n||!r){var s=VODUploadError.format(VODUploadError.CODE.STSInvalid,VODUploadError.MESSAGE.STSInvalid,n,r);throw new Error(s.message)}return this.options.isRunning?(this.init(e,t,n,r),i.ossUpload.resumeUploadWithToken(e,t,n),!0):!1}};