我正在使用jquery的ajax
调用将10GB文件传输到node.js
服务器。我很高兴我的第一次测试成功,但在随后的测试中,我正在调用服务器上的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;
}
在node.js
与express
服务器上:
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)
答案 0 :(得分:1)
好的,因为Eric接受了答案。 对于所有未来的用户,针对此问题的KISS解决方案将是增加服务器配置的超时值。
例如12000ms = 12s将是最大值。请求中止后的时间。
server.timeout = 120000
此外,如果您要上传大型文件,我建议您为用户提供某种“进度”反馈,例如:基本的加载圈。