1- var Async = require ( '../lib /async' ) ;
1+ var Async = require ( './async' ) ;
22var EventProxy = require ( './event' ) . EventProxy ;
33var util = require ( './util' ) ;
44
@@ -17,7 +17,7 @@ function sliceUploadFile(params, callback) {
1717 var FileSize ;
1818 var self = this ;
1919
20- var onProgress = params . onProgress ;
20+ var onProgress ;
2121 var onHashProgress = params . onHashProgress ;
2222
2323 // 上传过程中出现错误,返回错误
@@ -38,13 +38,15 @@ function sliceUploadFile(params, callback) {
3838 Region : Region ,
3939 Key : Key ,
4040 UploadId : UploadData . UploadId ,
41- SliceList : UploadData . SliceList
41+ SliceList : UploadData . SliceList ,
4242 } , function ( err , data ) {
4343 if ( ! self . _isRunningTask ( TaskId ) ) return ;
4444 delete uploadIdUsing [ UploadData . UploadId ] ;
4545 if ( err ) {
46+ onProgress ( null , true ) ;
4647 return ep . emit ( 'error' , err ) ;
4748 }
49+ onProgress ( { loaded : FileSize , total : FileSize } , true ) ;
4850 removeUploadId . call ( self , UploadData . UploadId ) ;
4951 ep . emit ( 'upload_complete' , data ) ;
5052 } ) ;
@@ -54,7 +56,7 @@ function sliceUploadFile(params, callback) {
5456 ep . on ( 'get_upload_data_finish' , function ( UploadData ) {
5557
5658 // 处理 UploadId 缓存
57- var uuid = getFileUuid ( Body , params . ChunkSize ) ;
59+ var uuid = util . getFileUUID ( Body , params . ChunkSize ) ;
5860 uuid && setUploadId . call ( self , uuid , UploadData . UploadId ) ; // 缓存 UploadId
5961 uploadIdUsing [ UploadData . UploadId ] = true ; // 标记 UploadId 为正在使用
6062 TaskId && self . on ( 'inner-kill-task' , function ( data ) {
@@ -78,13 +80,19 @@ function sliceUploadFile(params, callback) {
7880 onProgress : onProgress
7981 } , function ( err , data ) {
8082 if ( ! self . _isRunningTask ( TaskId ) ) return ;
81- if ( err ) return ep . emit ( 'error' , err ) ;
83+ if ( err ) {
84+ onProgress ( null , true ) ;
85+ return ep . emit ( 'error' , err ) ;
86+ }
8287 ep . emit ( 'upload_slice_complete' , data ) ;
8388 } ) ;
8489 } ) ;
8590
8691 // 开始获取文件 UploadId,里面会视情况计算 ETag,并比对,保证文件一致性,也优化上传
8792 ep . on ( 'get_file_size_finish' , function ( ) {
93+
94+ onProgress = util . throttleOnProgress . call ( self , FileSize , params . onProgress ) ;
95+
8896 if ( params . UploadData . UploadId ) {
8997 ep . emit ( 'get_upload_data_finish' , params . UploadData ) ;
9098 } else {
@@ -111,7 +119,7 @@ function sliceUploadFile(params, callback) {
111119 } ) ;
112120
113121 // 获取上传文件大小
114- FileSize = Body . size || params . ContentLength ;
122+ FileSize = params . ContentLength ;
115123 delete params . ContentLength ;
116124 ! params . Headers && ( params . Headers = { } ) ;
117125 util . each ( params . Headers , function ( item , key ) {
@@ -151,7 +159,7 @@ function initUploadId() {
151159 if ( ! uploadIdCache ) {
152160 if ( cacheLimit ) {
153161 try {
154- uploadIdCache = JSON . parse ( localStorage . getItem ( uploadIdCacheKey ) ) || [ ] ;
162+ uploadIdCache = JSON . parse ( util . localStorage . getItem ( uploadIdCacheKey ) ) || [ ] ;
155163 } catch ( e ) { }
156164 }
157165 if ( ! uploadIdCache ) {
@@ -173,7 +181,7 @@ function setUploadId(uuid, UploadId, isDisabled) {
173181 }
174182 cacheLimit && setTimeout ( function ( ) {
175183 try {
176- localStorage . setItem ( uploadIdCacheKey , JSON . stringify ( uploadIdCache ) ) ;
184+ util . localStorage . setItem ( uploadIdCacheKey , JSON . stringify ( uploadIdCache ) ) ;
177185 } catch ( e ) { }
178186 } ) ;
179187}
@@ -192,9 +200,9 @@ function removeUploadId(UploadId) {
192200 cacheLimit && setTimeout ( function ( ) {
193201 try {
194202 if ( uploadIdCache . length ) {
195- localStorage . setItem ( uploadIdCacheKey , JSON . stringify ( uploadIdCache ) ) ;
203+ util . localStorage . setItem ( uploadIdCacheKey , JSON . stringify ( uploadIdCache ) ) ;
196204 } else {
197- localStorage . removeItem ( uploadIdCacheKey ) ;
205+ util . localStorage . removeItem ( uploadIdCacheKey ) ;
198206 }
199207 } catch ( e ) { }
200208 } ) ;
@@ -209,22 +217,13 @@ function getUploadId(uuid) {
209217 }
210218 return CacheUploadIdList . length ? CacheUploadIdList : null ;
211219}
212- function getFileUuid ( file , ChunkSize ) {
213- // 如果信息不完整,不获取
214- if ( file . name && file . size && file . lastModifiedDate && ChunkSize ) {
215- return util . md5 ( [ file . name , file . size , file . lastModifiedDate , ChunkSize ] . join ( '::' ) ) ;
216- } else {
217- return null ;
218- }
219- }
220220
221221// 获取上传任务的 UploadId
222222function getUploadIdAndPartList ( params , callback ) {
223223 var TaskId = params . TaskId ;
224224 var Bucket = params . Bucket ;
225225 var Region = params . Region ;
226226 var Key = params . Key ;
227- var Body = params . Body ;
228227 var StorageClass = params . StorageClass ;
229228 var self = this ;
230229
@@ -248,8 +247,8 @@ function getUploadIdAndPartList(params, callback) {
248247 Size : ChunkSize
249248 } ) ;
250249 } else {
251- var blob = util . fileSlice ( Body , start , end ) ;
252- util . getFileMd5 ( blob , function ( err , md5 ) {
250+ var chunkItem = util . fileSlice ( params . Body , start , end ) ;
251+ util . getFileMd5 ( chunkItem , function ( err , md5 ) {
253252 if ( err ) return callback ( err ) ;
254253 var ETag = '"' + md5 + '"' ;
255254 ETagMap [ PartNumber ] = ETag ;
@@ -410,7 +409,7 @@ function getUploadIdAndPartList(params, callback) {
410409 // 在本地缓存找可用的 UploadId
411410 ep . on ( 'seek_local_avail_upload_id' , function ( RemoteUploadIdList ) {
412411 // 在本地找可用的 UploadId
413- var uuid = getFileUuid ( params . Body , params . ChunkSize ) , LocalUploadIdList ;
412+ var uuid = util . getFileUUID ( params . Body , params . ChunkSize ) , LocalUploadIdList ;
414413 if ( uuid && ( LocalUploadIdList = getUploadId . call ( self , uuid ) ) ) {
415414 var next = function ( index ) {
416415 // 如果找不到,到线上列出 UploadId
@@ -477,7 +476,7 @@ function getUploadIdAndPartList(params, callback) {
477476 if ( RemoteUploadIdList . length ) {
478477 ep . emit ( 'seek_local_avail_upload_id' , RemoteUploadIdList ) ;
479478 } else {
480- var uuid = getFileUuid ( params . Body , params . ChunkSize ) , LocalUploadIdList ;
479+ var uuid = util . getFileUUID ( params . Body , params . ChunkSize ) , LocalUploadIdList ;
481480 if ( uuid && ( LocalUploadIdList = getUploadId . call ( self , uuid ) ) ) {
482481 util . each ( LocalUploadIdList , function ( UploadId ) {
483482 removeUploadId . call ( self , UploadId ) ;
@@ -573,8 +572,7 @@ function uploadSliceList(params, cb) {
573572 }
574573 return ! SliceItem [ 'Uploaded' ] ;
575574 } ) ;
576-
577- var onProgress = util . throttleOnProgress . call ( self , FileSize , params . onProgress ) ;
575+ var onProgress = params . onProgress ;
578576
579577 Async . eachLimit ( needUploadSlices , ChunkParallel , function ( SliceItem , asyncCallback ) {
580578 if ( ! self . _isRunningTask ( TaskId ) ) return ;
@@ -599,7 +597,7 @@ function uploadSliceList(params, cb) {
599597 } ,
600598 } , function ( err , data ) {
601599 if ( ! self . _isRunningTask ( TaskId ) ) return ;
602- if ( ! err && ! data . ETag ) {
600+ if ( util . isBrowser && ! err && ! data . ETag ) {
603601 err = 'get ETag error, please add "ETag" to CORS ExposeHeader setting.' ;
604602 }
605603 if ( err ) {
@@ -613,10 +611,7 @@ function uploadSliceList(params, cb) {
613611
614612 } , function ( err ) {
615613 if ( ! self . _isRunningTask ( TaskId ) ) return ;
616- onProgress ( null , true ) ;
617- if ( err ) {
618- return cb ( err ) ;
619- }
614+ if ( err ) return cb ( err ) ;
620615 cb ( null , {
621616 UploadId : UploadData . UploadId ,
622617 SliceList : UploadData . PartList
@@ -708,7 +703,6 @@ function uploadSliceComplete(params, callback) {
708703 if ( err ) {
709704 return callback ( err ) ;
710705 }
711-
712706 callback ( null , data ) ;
713707 } ) ;
714708}
@@ -888,53 +882,56 @@ function uploadFiles(params, callback) {
888882 // 开始处理每个文件
889883 var taskList = [ ] ;
890884 util . each ( params . files , function ( fileParams , index ) {
885+ ( function ( ) {
891886
892- var Body = fileParams . Body ;
893- var FileSize = Body . size || Body . length || 0 ;
894- var fileInfo = { Index : index , TaskId : '' } ;
887+ var Body = fileParams . Body ;
888+ var FileSize = Body . size || Body . length || 0 ;
889+ var fileInfo = { Index : index , TaskId : '' } ;
895890
896- // 更新文件总大小
897- TotalSize += FileSize ;
891+ // 更新文件总大小
892+ TotalSize += FileSize ;
898893
899- // 整理 option,用于返回给回调
900- util . each ( fileParams , function ( v , k ) {
901- if ( typeof v !== 'object' && typeof v !== 'function' ) {
902- fileInfo [ k ] = v ;
903- }
904- } ) ;
894+ // 整理 option,用于返回给回调
895+ util . each ( fileParams , function ( v , k ) {
896+ if ( typeof v !== 'object' && typeof v !== 'function' ) {
897+ fileInfo [ k ] = v ;
898+ }
899+ } ) ;
905900
906- // 处理单个文件 TaskReady
907- var _TaskReady = fileParams . TaskReady ;
908- var TaskReady = function ( tid ) {
909- fileInfo . TaskId = tid ;
910- _TaskReady && _TaskReady ( tid ) ;
911- } ;
912- fileParams . TaskReady = TaskReady ;
913-
914- // 处理单个文件进度
915- var PreAddSize = 0 ;
916- var _onProgress = fileParams . onProgress ;
917- var onProgress = function ( info ) {
918- TotalFinish = TotalFinish - PreAddSize + info . loaded ;
919- PreAddSize = info . loaded ;
920- _onProgress && _onProgress ( info ) ;
921- onTotalProgress ( { loaded : TotalFinish , total : TotalSize } ) ;
922- } ;
923- fileParams . onProgress = onProgress ;
901+ // 处理单个文件 TaskReady
902+ var _TaskReady = fileParams . TaskReady ;
903+ var TaskReady = function ( tid ) {
904+ fileInfo . TaskId = tid ;
905+ _TaskReady && _TaskReady ( tid ) ;
906+ } ;
907+ fileParams . TaskReady = TaskReady ;
908+
909+ // 处理单个文件进度
910+ var PreAddSize = 0 ;
911+ var _onProgress = fileParams . onProgress ;
912+ var onProgress = function ( info ) {
913+ TotalFinish = TotalFinish - PreAddSize + info . loaded ;
914+ PreAddSize = info . loaded ;
915+ _onProgress && _onProgress ( info ) ;
916+ onTotalProgress ( { loaded : TotalFinish , total : TotalSize } ) ;
917+ } ;
918+ fileParams . onProgress = onProgress ;
924919
925- // 处理单个文件完成
926- var _onFileFinish = fileParams . onFileFinish ;
927- var onFileFinish = function ( err , data ) {
928- _onFileFinish && _onFileFinish ( err , data ) ;
929- onTotalFileFinish && onTotalFileFinish ( err , data , fileInfo ) ;
930- } ;
920+ // 处理单个文件完成
921+ var _onFileFinish = fileParams . onFileFinish ;
922+ var onFileFinish = function ( err , data ) {
923+ _onFileFinish && _onFileFinish ( err , data ) ;
924+ onTotalFileFinish && onTotalFileFinish ( err , data , fileInfo ) ;
925+ } ;
931926
932- // 添加上传任务
933- taskList . push ( {
934- api : FileSize >= SliceSize ? 'sliceUploadFile' : 'putObject' ,
935- params : fileParams ,
936- callback : onFileFinish ,
937- } ) ;
927+ // 添加上传任务
928+ var api = FileSize >= SliceSize ? 'sliceUploadFile' : 'putObject' ;
929+ taskList . push ( {
930+ api : api ,
931+ params : fileParams ,
932+ callback : onFileFinish ,
933+ } ) ;
934+ } ) ( ) ;
938935 } ) ;
939936 self . _addTasks ( taskList ) ;
940937}
0 commit comments