@@ -119,6 +119,8 @@ function putReq(config, uploadToken, key, rsStream, rsStreamLen, putExtra,
119
119
var finishedBlock = 0 ;
120
120
var curBlock = 0 ;
121
121
var readLen = 0 ;
122
+ var bufferLen = 0 ;
123
+ var remainedData = new Buffer ( 0 ) ;
122
124
var readBuffers = [ ] ;
123
125
var finishedCtxList = [ ] ;
124
126
var finishedBlkPutRets = [ ] ;
@@ -151,19 +153,26 @@ function putReq(config, uploadToken, key, rsStream, rsStreamLen, putExtra,
151
153
//check when to mkblk
152
154
rsStream . on ( 'data' , function ( chunk ) {
153
155
readLen += chunk . length ;
156
+ bufferLen += chunk . length ;
154
157
readBuffers . push ( chunk ) ;
155
158
156
- if ( readLen % conf . BLOCK_SIZE == 0 || readLen == fileSize ) {
157
- //console.log(readLen);
158
- var readData = Buffer . concat ( readBuffers ) ;
159
- readBuffers = [ ] ; //reset read buffer
159
+ if ( bufferLen >= conf . BLOCK_SIZE || readLen == fileSize ) {
160
+ var readBuffersData = Buffer . concat ( readBuffers ) ;
161
+ var blockSize = conf . BLOCK_SIZE - remainedData . length ;
162
+
163
+ var postData = Buffer . concat ( [ remainedData , readBuffersData . slice ( 0 , blockSize ) ] ) ;
164
+ remainedData = new Buffer ( readBuffersData . slice ( blockSize , bufferLen ) ) ;
165
+ bufferLen = bufferLen - conf . BLOCK_SIZE ;
166
+ //reset buffer
167
+ readBuffers = [ ] ;
168
+
160
169
curBlock += 1 ; //set current block
161
170
if ( curBlock > finishedBlock ) {
162
171
rsStream . pause ( ) ;
163
- mkblkReq ( upDomain , uploadToken , readData , function ( respErr ,
172
+ mkblkReq ( upDomain , uploadToken , postData , function ( respErr ,
164
173
respBody ,
165
174
respInfo ) {
166
- var bodyCrc32 = parseInt ( "0x" + getCrc32 ( readData ) ) ;
175
+ var bodyCrc32 = parseInt ( "0x" + getCrc32 ( postData ) ) ;
167
176
if ( respInfo . statusCode != 200 || respBody . crc32 != bodyCrc32 ) {
168
177
callbackFunc ( respErr , respBody , respInfo ) ;
169
178
rsStream . close ( ) ;
@@ -258,7 +267,9 @@ function mkfileReq(upDomain, uploadToken, fileSize, ctxList, key, putExtra,
258
267
ResumeUploader . prototype . putFile = function ( uploadToken , key , localFile ,
259
268
putExtra , callbackFunc ) {
260
269
putExtra = putExtra || new PutExtra ( ) ;
261
- var rsStream = fs . createReadStream ( localFile ) ;
270
+ var rsStream = fs . createReadStream ( localFile , {
271
+ highWaterMark : conf . BLOCK_SIZE ,
272
+ } ) ;
262
273
var rsStreamLen = fs . statSync ( localFile ) . size ;
263
274
if ( ! putExtra . mimeType ) {
264
275
putExtra . mimeType = mime . getType ( localFile ) ;
0 commit comments