@@ -81,6 +81,7 @@ function sliceUploadFile(params, callback) {
8181 Bucket : Bucket ,
8282 Region : Region ,
8383 Key : Key ,
84+ Headers : params . Headers ,
8485 StorageClass : StorageClass ,
8586 FilePath : FilePath ,
8687 FileSize : FileSize ,
@@ -208,7 +209,7 @@ function getUploadIdAndPartList(params, callback) {
208209 return callback ( errData ) ;
209210 } ) ;
210211
211- // 不存在 UploadId
212+ // 存在 UploadId
212213 ep . on ( 'upload_id_ready' , function ( UploadData ) {
213214 // 转换成 map
214215 var map = { } ;
@@ -242,6 +243,7 @@ function getUploadIdAndPartList(params, callback) {
242243 Bucket : Bucket ,
243244 Region : Region ,
244245 Key : Key ,
246+ Headers : params . Headers ,
245247 StorageClass : StorageClass ,
246248 } ) ;
247249 self . multipartInit ( _params , function ( err , data ) {
@@ -418,8 +420,8 @@ function uploadSliceList(params, cb) {
418420 SliceSize : SliceSize ,
419421 FileSize : FileSize ,
420422 PartNumber : PartNumber ,
423+ ServerSideEncryption : ServerSideEncryption ,
421424 FilePath : FilePath ,
422- ServerSideEncryption : ServerSideEncryption ,
423425 UploadData : UploadData ,
424426 onProgress : function ( data ) {
425427 FinishSize += data . loaded - preAddSize ;
@@ -566,6 +568,7 @@ function abortUploadTask(params, callback) {
566568 Bucket : Bucket ,
567569 Region : Region ,
568570 Key : Key ,
571+ Headers : params . Headers ,
569572 AsyncLimit : AsyncLimit ,
570573 AbortArray : AbortArray
571574 } , function ( err , data ) {
@@ -638,6 +641,7 @@ function abortUploadTaskArray(params, callback) {
638641 Bucket : Bucket ,
639642 Region : Region ,
640643 Key : AbortItem . Key ,
644+ Headers : params . Headers ,
641645 UploadId : UploadId
642646 } , function ( err , data ) {
643647 var task = {
@@ -678,9 +682,96 @@ function abortUploadTaskArray(params, callback) {
678682}
679683
680684
685+ // 批量上传文件
686+ function uploadFiles ( params , callback ) {
687+ var self = this ;
688+
689+ // 判断多大的文件使用分片上传
690+ var SliceSize = params . SliceSize === undefined ? self . options . SliceSize : params . SliceSize ;
691+
692+ // 汇总返回进度
693+ var TotalSize = 0 ;
694+ var TotalFinish = 0 ;
695+ var onTotalProgress = util . throttleOnProgress . call ( self , TotalFinish , params . onProgress ) ;
696+
697+ // 汇总返回回调
698+ var unFinishCount = params . files . length ;
699+ var _onTotalFileFinish = params . onFileFinish ;
700+ var resultList = Array ( unFinishCount ) ;
701+ var onTotalFileFinish = function ( err , data , options ) {
702+ onTotalProgress ( null , true ) ;
703+ _onTotalFileFinish && _onTotalFileFinish ( err , data , options ) ;
704+ resultList [ options . Index ] = {
705+ options : options ,
706+ error : err ,
707+ data : data
708+ } ;
709+ if ( -- unFinishCount <= 0 && callback ) {
710+ callback ( null , {
711+ files : resultList ,
712+ } ) ;
713+ }
714+ } ;
715+
716+ // 开始处理每个文件
717+ var taskList = [ ] ;
718+ util . each ( params . files , function ( fileParams , index ) {
719+
720+ var Body = fileParams . Body ;
721+ var FileSize = Body . size || Body . length || 0 ;
722+ var fileInfo = { Index : index , TaskId : '' } ;
723+
724+ // 更新文件总大小
725+ TotalSize += FileSize ;
726+
727+ // 整理 option,用于返回给回调
728+ util . each ( fileParams , function ( v , k ) {
729+ if ( typeof v !== 'object' && typeof v !== 'function' ) {
730+ fileInfo [ k ] = v ;
731+ }
732+ } ) ;
733+
734+ // 处理单个文件 TaskReady
735+ var _TaskReady = fileParams . TaskReady ;
736+ var TaskReady = function ( tid ) {
737+ fileInfo . TaskId = tid ;
738+ _TaskReady && _TaskReady ( tid ) ;
739+ } ;
740+ fileParams . TaskReady = TaskReady ;
741+
742+ // 处理单个文件进度
743+ var PreAddSize = 0 ;
744+ var _onProgress = fileParams . onProgress ;
745+ var onProgress = function ( info ) {
746+ TotalFinish = TotalFinish - PreAddSize + info . loaded ;
747+ PreAddSize = info . loaded ;
748+ _onProgress && _onProgress ( info ) ;
749+ onTotalProgress ( { loaded : TotalFinish , total : TotalSize } ) ;
750+ } ;
751+ fileParams . onProgress = onProgress ;
752+
753+ // 处理单个文件完成
754+ var _onFileFinish = fileParams . onFileFinish ;
755+ var onFileFinish = function ( err , data ) {
756+ _onFileFinish && _onFileFinish ( err , data ) ;
757+ onTotalFileFinish && onTotalFileFinish ( err , data , fileInfo ) ;
758+ } ;
759+
760+ // 添加上传任务
761+ taskList . push ( {
762+ api : FileSize >= SliceSize ? 'sliceUploadFile' : 'putObject' ,
763+ params : fileParams ,
764+ callback : onFileFinish ,
765+ } ) ;
766+ } ) ;
767+ self . _addTasks ( taskList ) ;
768+ }
769+
770+
681771var API_MAP = {
682772 sliceUploadFile : sliceUploadFile ,
683773 abortUploadTask : abortUploadTask ,
774+ uploadFiles : uploadFiles ,
684775} ;
685776
686777util . each ( API_MAP , function ( fn , apiName ) {
0 commit comments