gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:42:32 25 4
gpt4 key购买 nike

我正在使用 jquery 的 ajax打电话将 10GB 的文件传输到我的 node.js服务器。我很高兴我的第一次测试成功了,但在随后的测试中,我接到了一个电话 TCP._onclose在中止传输的服务器上。我试图避免执行手动文件 I/O 来分割文件,因为文件 I/O 读取会降低我的传输速率。所以,我的问题有两个:

1) 是 TCP._onclose传输如此大的文件时是否符合预期(或者我在某处有错误需要追踪)?

2) 如果我必须手动分割文件以发送更小的 block ,什么是合理的 block 大小以及是否有比使用 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)

最佳答案

好的,Eric 接受了答案。对于所有 future 的用户,针对此问题的 KISS 解决方案是增加服务器配置的超时值。

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

server.timeout = 120000

此外,如果您要上传如此大的文件,我建议为用户提供某种“进度”反馈,例如基本加载圈。

关于javascript - 在大文件的 http 传输中间歇性获取 TCP._onclose,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32952921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com