@@ -353,7 +353,7 @@ function getUploadIdAndPartList(params, callback) {
353353 Bucket : Bucket ,
354354 Region : Region ,
355355 Key : Key ,
356- Headers : params . Headers ,
356+ Headers : util . clone ( params . Headers ) ,
357357 StorageClass : StorageClass ,
358358 } , params ) ;
359359 self . multipartInit ( _params , function ( err , data ) {
@@ -519,7 +519,7 @@ function wholeMultipartList(params, callback) {
519519 self . multipartList ( sendParams , function ( err , data ) {
520520 if ( err ) return callback ( err ) ;
521521 UploadList . push . apply ( UploadList , data . Upload || [ ] ) ;
522- if ( data . IsTruncated == 'true' ) { // 列表不完整
522+ if ( data . IsTruncated === 'true' ) { // 列表不完整
523523 sendParams . KeyMarker = data . NextKeyMarker ;
524524 sendParams . UploadIdMarker = data . NextUploadIdMarker ;
525525 next ( ) ;
@@ -545,7 +545,7 @@ function wholeMultipartListPart(params, callback) {
545545 self . multipartListPart ( sendParams , function ( err , data ) {
546546 if ( err ) return callback ( err ) ;
547547 PartList . push . apply ( PartList , data . Part || [ ] ) ;
548- if ( data . IsTruncated == 'true' ) { // 列表不完整
548+ if ( data . IsTruncated === 'true' ) { // 列表不完整
549549 sendParams . PartNumberMarker = data . NextPartNumberMarker ;
550550 next ( ) ;
551551 } else {
@@ -814,10 +814,10 @@ function abortUploadTaskArray(params, callback) {
814814 var resultList = new Array ( AbortArray . length ) ;
815815 Async . eachLimit ( AbortArray , AsyncLimit , function ( AbortItem , callback ) {
816816 var eachIndex = index ;
817- if ( Key && Key != AbortItem . Key ) {
818- return callback ( null , {
819- KeyNotMatch : true
820- } ) ;
817+ if ( Key && Key !== AbortItem . Key ) {
818+ resultList [ eachIndex ] = { error : { KeyNotMatch : true } } ;
819+ callback ( null ) ;
820+ return ;
821821 }
822822 var UploadId = AbortItem . UploadId || AbortItem . UploadID ;
823823
@@ -1008,15 +1008,15 @@ function sliceCopyFile(params, callback) {
10081008 var currentSize = SliceItem . end - SliceItem . start ;
10091009 var preAddSize = 0 ;
10101010
1011- copySliceItem . call ( self , {
1011+ copySliceItem . call ( self , {
10121012 Bucket : Bucket ,
10131013 Region : Region ,
10141014 Key : Key ,
10151015 CopySource : CopySource ,
1016- UploadId :UploadData . UploadId ,
1017- PartNumber :PartNumber ,
1018- CopySourceRange :CopySourceRange ,
1019- onProgress :function ( data ) {
1016+ UploadId : UploadData . UploadId ,
1017+ PartNumber : PartNumber ,
1018+ CopySourceRange : CopySourceRange ,
1019+ onProgress : function ( data ) {
10201020 FinishSize += data . loaded - preAddSize ;
10211021 preAddSize = data . loaded ;
10221022 onProgress ( { loaded : FinishSize , total : FileSize } ) ;
@@ -1041,7 +1041,7 @@ function sliceCopyFile(params, callback) {
10411041 } ) ;
10421042 } ) ;
10431043
1044- ep . on ( 'get_file_size_finish' , function ( ) {
1044+ ep . on ( 'get_file_size_finish' , function ( SourceHeaders ) {
10451045 // 控制分片大小
10461046 ( function ( ) {
10471047 var SIZE = [ 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 , 256 , 512 , 1024 , 1024 * 2 , 1024 * 4 , 1024 * 5 ] ;
@@ -1069,10 +1069,19 @@ function sliceCopyFile(params, callback) {
10691069 params . PartList = list ;
10701070 } ) ( ) ;
10711071
1072+ var TargetHeader ;
1073+ if ( params . Headers [ 'x-cos-metadata-directive' ] === 'Replaced' ) {
1074+ TargetHeader = params . Headers ;
1075+ } else {
1076+ TargetHeader = SourceHeaders ;
1077+ }
1078+ TargetHeader [ 'x-cos-storage-class' ] = params . Headers [ 'x-cos-storage-class' ] || SourceHeaders [ 'x-cos-storage-class' ] ;
1079+ TargetHeader = util . clearKey ( TargetHeader ) ;
10721080 self . multipartInit ( {
10731081 Bucket : Bucket ,
10741082 Region : Region ,
10751083 Key : Key ,
1084+ Headers : TargetHeader ,
10761085 } , function ( err , data ) {
10771086 if ( err ) {
10781087 return callback ( err ) ;
@@ -1098,10 +1107,18 @@ function sliceCopyFile(params, callback) {
10981107 }
10991108
11001109 FileSize = params . FileSize = data . headers [ 'content-length' ] ;
1110+ if ( FileSize === undefined || ! FileSize ) {
1111+ callback ( { error : 'get Content-Length error, please add "Content-Length" to CORS ExposeHeader setting.' } ) ;
1112+ return ;
1113+ }
1114+
11011115 onProgress = util . throttleOnProgress . call ( self , FileSize , params . onProgress ) ;
11021116
11031117 // 开始上传
11041118 if ( FileSize <= CopySliceSize ) {
1119+ if ( ! params . Headers [ 'x-cos-metadata-directive' ] ) {
1120+ params . Headers [ 'x-cos-metadata-directive' ] = 'Copy' ;
1121+ }
11051122 self . putObjectCopy ( params , function ( err , data ) {
11061123 if ( err ) {
11071124 onProgress ( null , true ) ;
@@ -1111,7 +1128,22 @@ function sliceCopyFile(params, callback) {
11111128 callback ( err , data ) ;
11121129 } ) ;
11131130 } else {
1114- ep . emit ( 'get_file_size_finish' ) ;
1131+ var resHeaders = data . headers ;
1132+ var SourceHeaders = {
1133+ 'Cache-Control' : resHeaders [ 'cache-control' ] ,
1134+ 'Content-Disposition' : resHeaders [ 'content-disposition' ] ,
1135+ 'Content-Encoding' : resHeaders [ 'content-encoding' ] ,
1136+ 'Content-Type' : resHeaders [ 'content-type' ] ,
1137+ 'Expires' : resHeaders [ 'expires' ] ,
1138+ 'x-cos-storage-class' : resHeaders [ 'x-cos-storage-class' ] ,
1139+ } ;
1140+ util . each ( resHeaders , function ( v , k ) {
1141+ var metaPrefix = 'x-cos-meta-' ;
1142+ if ( k . indexOf ( metaPrefix ) === 0 && k . length > metaPrefix . length ) {
1143+ SourceHeaders [ k ] = v ;
1144+ }
1145+ } ) ;
1146+ ep . emit ( 'get_file_size_finish' , SourceHeaders ) ;
11151147 }
11161148 } ) ;
11171149}
0 commit comments