Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取TCP.\u在http传输大文件时间歇性丢失_Javascript_Jquery_Node.js_Express_Tcp - Fatal编程技术网

Javascript 获取TCP.\u在http传输大文件时间歇性丢失

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

我正在使用jquery的
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或类似的插件