1
- var Async = require ( '../lib /async' ) ;
1
+ var Async = require ( './async' ) ;
2
2
var EventProxy = require ( './event' ) . EventProxy ;
3
3
var util = require ( './util' ) ;
4
4
@@ -17,7 +17,7 @@ function sliceUploadFile(params, callback) {
17
17
var FileSize ;
18
18
var self = this ;
19
19
20
- var onProgress = params . onProgress ;
20
+ var onProgress ;
21
21
var onHashProgress = params . onHashProgress ;
22
22
23
23
// 上传过程中出现错误,返回错误
@@ -38,13 +38,15 @@ function sliceUploadFile(params, callback) {
38
38
Region : Region ,
39
39
Key : Key ,
40
40
UploadId : UploadData . UploadId ,
41
- SliceList : UploadData . SliceList
41
+ SliceList : UploadData . SliceList ,
42
42
} , function ( err , data ) {
43
43
if ( ! self . _isRunningTask ( TaskId ) ) return ;
44
44
delete uploadIdUsing [ UploadData . UploadId ] ;
45
45
if ( err ) {
46
+ onProgress ( null , true ) ;
46
47
return ep . emit ( 'error' , err ) ;
47
48
}
49
+ onProgress ( { loaded : FileSize , total : FileSize } , true ) ;
48
50
removeUploadId . call ( self , UploadData . UploadId ) ;
49
51
ep . emit ( 'upload_complete' , data ) ;
50
52
} ) ;
@@ -54,7 +56,7 @@ function sliceUploadFile(params, callback) {
54
56
ep . on ( 'get_upload_data_finish' , function ( UploadData ) {
55
57
56
58
// 处理 UploadId 缓存
57
- var uuid = getFileUuid ( Body , params . ChunkSize ) ;
59
+ var uuid = util . getFileUUID ( Body , params . ChunkSize ) ;
58
60
uuid && setUploadId . call ( self , uuid , UploadData . UploadId ) ; // 缓存 UploadId
59
61
uploadIdUsing [ UploadData . UploadId ] = true ; // 标记 UploadId 为正在使用
60
62
TaskId && self . on ( 'inner-kill-task' , function ( data ) {
@@ -78,13 +80,19 @@ function sliceUploadFile(params, callback) {
78
80
onProgress : onProgress
79
81
} , function ( err , data ) {
80
82
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
+ }
82
87
ep . emit ( 'upload_slice_complete' , data ) ;
83
88
} ) ;
84
89
} ) ;
85
90
86
91
// 开始获取文件 UploadId,里面会视情况计算 ETag,并比对,保证文件一致性,也优化上传
87
92
ep . on ( 'get_file_size_finish' , function ( ) {
93
+
94
+ onProgress = util . throttleOnProgress . call ( self , FileSize , params . onProgress ) ;
95
+
88
96
if ( params . UploadData . UploadId ) {
89
97
ep . emit ( 'get_upload_data_finish' , params . UploadData ) ;
90
98
} else {
@@ -111,7 +119,7 @@ function sliceUploadFile(params, callback) {
111
119
} ) ;
112
120
113
121
// 获取上传文件大小
114
- FileSize = Body . size || params . ContentLength ;
122
+ FileSize = params . ContentLength ;
115
123
delete params . ContentLength ;
116
124
! params . Headers && ( params . Headers = { } ) ;
117
125
util . each ( params . Headers , function ( item , key ) {
@@ -151,7 +159,7 @@ function initUploadId() {
151
159
if ( ! uploadIdCache ) {
152
160
if ( cacheLimit ) {
153
161
try {
154
- uploadIdCache = JSON . parse ( localStorage . getItem ( uploadIdCacheKey ) ) || [ ] ;
162
+ uploadIdCache = JSON . parse ( util . localStorage . getItem ( uploadIdCacheKey ) ) || [ ] ;
155
163
} catch ( e ) { }
156
164
}
157
165
if ( ! uploadIdCache ) {
@@ -173,7 +181,7 @@ function setUploadId(uuid, UploadId, isDisabled) {
173
181
}
174
182
cacheLimit && setTimeout ( function ( ) {
175
183
try {
176
- localStorage . setItem ( uploadIdCacheKey , JSON . stringify ( uploadIdCache ) ) ;
184
+ util . localStorage . setItem ( uploadIdCacheKey , JSON . stringify ( uploadIdCache ) ) ;
177
185
} catch ( e ) { }
178
186
} ) ;
179
187
}
@@ -192,9 +200,9 @@ function removeUploadId(UploadId) {
192
200
cacheLimit && setTimeout ( function ( ) {
193
201
try {
194
202
if ( uploadIdCache . length ) {
195
- localStorage . setItem ( uploadIdCacheKey , JSON . stringify ( uploadIdCache ) ) ;
203
+ util . localStorage . setItem ( uploadIdCacheKey , JSON . stringify ( uploadIdCache ) ) ;
196
204
} else {
197
- localStorage . removeItem ( uploadIdCacheKey ) ;
205
+ util . localStorage . removeItem ( uploadIdCacheKey ) ;
198
206
}
199
207
} catch ( e ) { }
200
208
} ) ;
@@ -209,22 +217,13 @@ function getUploadId(uuid) {
209
217
}
210
218
return CacheUploadIdList . length ? CacheUploadIdList : null ;
211
219
}
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
- }
220
220
221
221
// 获取上传任务的 UploadId
222
222
function getUploadIdAndPartList ( params , callback ) {
223
223
var TaskId = params . TaskId ;
224
224
var Bucket = params . Bucket ;
225
225
var Region = params . Region ;
226
226
var Key = params . Key ;
227
- var Body = params . Body ;
228
227
var StorageClass = params . StorageClass ;
229
228
var self = this ;
230
229
@@ -248,8 +247,8 @@ function getUploadIdAndPartList(params, callback) {
248
247
Size : ChunkSize
249
248
} ) ;
250
249
} 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 ) {
253
252
if ( err ) return callback ( err ) ;
254
253
var ETag = '"' + md5 + '"' ;
255
254
ETagMap [ PartNumber ] = ETag ;
@@ -410,7 +409,7 @@ function getUploadIdAndPartList(params, callback) {
410
409
// 在本地缓存找可用的 UploadId
411
410
ep . on ( 'seek_local_avail_upload_id' , function ( RemoteUploadIdList ) {
412
411
// 在本地找可用的 UploadId
413
- var uuid = getFileUuid ( params . Body , params . ChunkSize ) , LocalUploadIdList ;
412
+ var uuid = util . getFileUUID ( params . Body , params . ChunkSize ) , LocalUploadIdList ;
414
413
if ( uuid && ( LocalUploadIdList = getUploadId . call ( self , uuid ) ) ) {
415
414
var next = function ( index ) {
416
415
// 如果找不到,到线上列出 UploadId
@@ -477,7 +476,7 @@ function getUploadIdAndPartList(params, callback) {
477
476
if ( RemoteUploadIdList . length ) {
478
477
ep . emit ( 'seek_local_avail_upload_id' , RemoteUploadIdList ) ;
479
478
} else {
480
- var uuid = getFileUuid ( params . Body , params . ChunkSize ) , LocalUploadIdList ;
479
+ var uuid = util . getFileUUID ( params . Body , params . ChunkSize ) , LocalUploadIdList ;
481
480
if ( uuid && ( LocalUploadIdList = getUploadId . call ( self , uuid ) ) ) {
482
481
util . each ( LocalUploadIdList , function ( UploadId ) {
483
482
removeUploadId . call ( self , UploadId ) ;
@@ -573,8 +572,7 @@ function uploadSliceList(params, cb) {
573
572
}
574
573
return ! SliceItem [ 'Uploaded' ] ;
575
574
} ) ;
576
-
577
- var onProgress = util . throttleOnProgress . call ( self , FileSize , params . onProgress ) ;
575
+ var onProgress = params . onProgress ;
578
576
579
577
Async . eachLimit ( needUploadSlices , ChunkParallel , function ( SliceItem , asyncCallback ) {
580
578
if ( ! self . _isRunningTask ( TaskId ) ) return ;
@@ -599,7 +597,7 @@ function uploadSliceList(params, cb) {
599
597
} ,
600
598
} , function ( err , data ) {
601
599
if ( ! self . _isRunningTask ( TaskId ) ) return ;
602
- if ( ! err && ! data . ETag ) {
600
+ if ( util . isBrowser && ! err && ! data . ETag ) {
603
601
err = 'get ETag error, please add "ETag" to CORS ExposeHeader setting.' ;
604
602
}
605
603
if ( err ) {
@@ -613,10 +611,7 @@ function uploadSliceList(params, cb) {
613
611
614
612
} , function ( err ) {
615
613
if ( ! self . _isRunningTask ( TaskId ) ) return ;
616
- onProgress ( null , true ) ;
617
- if ( err ) {
618
- return cb ( err ) ;
619
- }
614
+ if ( err ) return cb ( err ) ;
620
615
cb ( null , {
621
616
UploadId : UploadData . UploadId ,
622
617
SliceList : UploadData . PartList
@@ -708,7 +703,6 @@ function uploadSliceComplete(params, callback) {
708
703
if ( err ) {
709
704
return callback ( err ) ;
710
705
}
711
-
712
706
callback ( null , data ) ;
713
707
} ) ;
714
708
}
@@ -888,53 +882,56 @@ function uploadFiles(params, callback) {
888
882
// 开始处理每个文件
889
883
var taskList = [ ] ;
890
884
util . each ( params . files , function ( fileParams , index ) {
885
+ ( function ( ) {
891
886
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 : '' } ;
895
890
896
- // 更新文件总大小
897
- TotalSize += FileSize ;
891
+ // 更新文件总大小
892
+ TotalSize += FileSize ;
898
893
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
+ } ) ;
905
900
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 ;
924
919
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
+ } ;
931
926
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
+ } ) ( ) ;
938
935
} ) ;
939
936
self . _addTasks ( taskList ) ;
940
937
}
0 commit comments