@@ -119,6 +119,8 @@ function putReq(config, uploadToken, key, rsStream, rsStreamLen, putExtra,
119119 var finishedBlock = 0 ;
120120 var curBlock = 0 ;
121121 var readLen = 0 ;
122+ var bufferLen = 0 ;
123+ var remainedData = new Buffer ( 0 ) ;
122124 var readBuffers = [ ] ;
123125 var finishedCtxList = [ ] ;
124126 var finishedBlkPutRets = [ ] ;
@@ -151,19 +153,26 @@ function putReq(config, uploadToken, key, rsStream, rsStreamLen, putExtra,
151153 //check when to mkblk
152154 rsStream . on ( 'data' , function ( chunk ) {
153155 readLen += chunk . length ;
156+ bufferLen += chunk . length ;
154157 readBuffers . push ( chunk ) ;
155158
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+
160169 curBlock += 1 ; //set current block
161170 if ( curBlock > finishedBlock ) {
162171 rsStream . pause ( ) ;
163- mkblkReq ( upDomain , uploadToken , readData , function ( respErr ,
172+ mkblkReq ( upDomain , uploadToken , postData , function ( respErr ,
164173 respBody ,
165174 respInfo ) {
166- var bodyCrc32 = parseInt ( "0x" + getCrc32 ( readData ) ) ;
175+ var bodyCrc32 = parseInt ( "0x" + getCrc32 ( postData ) ) ;
167176 if ( respInfo . statusCode != 200 || respBody . crc32 != bodyCrc32 ) {
168177 callbackFunc ( respErr , respBody , respInfo ) ;
169178 rsStream . close ( ) ;
@@ -258,7 +267,9 @@ function mkfileReq(upDomain, uploadToken, fileSize, ctxList, key, putExtra,
258267ResumeUploader . prototype . putFile = function ( uploadToken , key , localFile ,
259268 putExtra , callbackFunc ) {
260269 putExtra = putExtra || new PutExtra ( ) ;
261- var rsStream = fs . createReadStream ( localFile ) ;
270+ var rsStream = fs . createReadStream ( localFile , {
271+ highWaterMark : conf . BLOCK_SIZE ,
272+ } ) ;
262273 var rsStreamLen = fs . statSync ( localFile ) . size ;
263274 if ( ! putExtra . mimeType ) {
264275 putExtra . mimeType = mime . getType ( localFile ) ;
0 commit comments