Javascript 获取TCP.\u在http传输大文件时间歇性丢失
我正在使用jquery的Javascript 获取TCP.\u在http传输大文件时间歇性丢失,javascript,jquery,node.js,express,tcp,Javascript,Jquery,Node.js,Express,Tcp,我正在使用jquery的ajax调用将一个10GB的文件传输到我的node.js服务器。我很高兴我的第一次测试成功了,但在随后的测试中,我在服务器上接到了对TCP.\u onclose的调用,该服务器中止了传输。我试图避免手动执行文件I/O来切碎文件,因为文件I/O读取正在降低我的传输速率。因此,我的问题有两个: 1) 传输如此大的文件时,是否会出现TCP.\u onclose(或者我是否有需要跟踪的错误) 2) 如果我必须手动分割文件以发送较小的块,那么合理的块大小是多少?有没有比使用file
ajax
调用将一个10GB的文件传输到我的node.js
服务器。我很高兴我的第一次测试成功了,但在随后的测试中,我在服务器上接到了对TCP.\u onclose
的调用,该服务器中止了传输。我试图避免手动执行文件I/O来切碎文件,因为文件I/O读取正在降低我的传输速率。因此,我的问题有两个:
1) 传输如此大的文件时,是否会出现TCP.\u 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)
好的,埃里克接受了答案。 对于所有未来的用户,这个问题的KISS解决方案是增加服务器配置的超时值 例如,12000ms=12s是请求中止后的最长时间
server.timeout = 120000
此外,如果你上传这么大的文件,我建议你给用户一些“进度”反馈,例如基本加载循环。你使用的是express.js吗(我想是的)。也许只是增加一个更高的服务器。超时有点帮助。我认为一般来说,您的上传时间太长,服务器只是由于server.timeout限制而中止了请求。根据您的错误消息,您使用“多方”作为“强大”的分支。此模块正在使用超时值->或您是我的英雄。这就解决了!如果您愿意转载您的评论作为答复,我将欣然接受o) 这就是:)如果你将它用于某种“高效”的情况,我建议你寻找合适的解决方案,例如HTML5文件API或类似的插件