在大文件的http传输中间歇性地获取TCP._onclose

我正在使用jQuery的ajax调用将10GB文件传输到我的node.js服务器。 我很高兴,我的第一次testing成功,但在随后的testing中,我正在调用TCP._onclose在中止传输的服务器上。 我试图避免做手动文件I / O来砍文件,因为文件I / O读取正在杀死我的传输速率。 所以,我的问题是双重的:

1)传输一个文件这么大(或者我有一个需要追踪的地方的错误)的TCP._onclose

2)如果我必须手动骰子文件发送较小的块,什么是合理的块大小,是否有一个更有效的方法来骰子比使用file.slice(..)然后FileReader.readAsBinaryString(..)并发送阅读器onload函数上的数据?

这是我目前的客户端代码:

 $( "#streamUploadButton" ).click( function() { lastPlace = 0; startTime = lastTime = Date.now(); $.ajax( { xhr: function() { var xhr = new XMLHttpRequest(); xhr.upload.addEventListener( "progress", function( evt ) { if ( evt.lengthComputable ) { var place = evt.loaded; var percentComplete = place / evt.total * 100; updateStats( $( "#uploadStreamingRate" ), place, $( "#uploadProgress" ), percentComplete ); lastPlace = place; lastTime = Date.now(); } }, false ); return xhr; }, url: "/httpUpload", type: "POST", processData: false, contentType: false, data: createFileFormData( $( "#uploadFileInput" ) ), success: function() { reportComplete( $( "#uploadStreamingRate" ), $( "#uploadProgress" ) ); }, error: function( error ) { console.error( "HttpUpload failed: " + error.responseText ); } } ); } ); function createFileFormData( $fileInput ) { var formData = new FormData(); file = $fileInput[ 0 ].files[ 0 ]; formData.append( "file", file ); return formData; } 

而在具有express服务器的node.js上:

 app.post( "/httpUpload", function( req, res ) { res.send( "Done!" ); var file = req.files.file; fs.renameSync( file.path, __dirname + '/temp/' + file.name ); console.log( "Received post request"); } ); 

这是我在服务器控制台中得到的错误消息:

 Error: Request aborted at IncomingMessage.onReqAborted (node_modules\connect-multiparty\node_modules\multiparty\index.js:183:17) at emitNone (events.js:67:13) at IncomingMessage.emit (events.js:166:7) at abortIncoming (_http_server.js:267:11) at Socket.serverSocketCloseListener (_http_server.js:280:5) at emitOne (events.js:82:20) at Socket.emit (events.js:169:7) at TCP._onclose (net.js:469:12) 

好的,埃里克接受了答案。 对于所有未来的用户来说,这个问题的KISS解决scheme将增加您的服务器configuration的超时值。

例如12000ms = 12s将是最大的。 请求被中止后的时间。

 server.timeout = 120000 

另外,如果你正在上传这样的大文件,例如基本的加载循环,我会推荐给用户一些“进度”反馈。