Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.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
Node.js 非分块多部分/混合帖子?_Node.js - Fatal编程技术网

Node.js 非分块多部分/混合帖子?

Node.js 非分块多部分/混合帖子?,node.js,Node.js,我试图在一篇多部分/混合文章中将多个二进制文件发送到web服务,但似乎无法使其正常工作。。。目标服务器拒绝它。我注意到的一件事是Node正在尝试以分块的方式进行编码,这是我不想要的: POST /SomeFiles HTTP/1.1 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary=123456789012345 Host: host.server.com Connection: keep-alive Transfer-Encod

我试图在一篇多部分/混合文章中将多个二进制文件发送到web服务,但似乎无法使其正常工作。。。目标服务器拒绝它。我注意到的一件事是Node正在尝试以分块的方式进行编码,这是我不想要的:

POST /SomeFiles HTTP/1.1
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=123456789012345
Host: host.server.com
Connection: keep-alive
Transfer-Encoding: chunked
我如何让它停止被阻塞?文档说,可以通过在主请求头中设置内容长度来禁用该功能,但我无法设置内容长度,因为,除其他原因外,我一次加载一个文件,但也不需要它,因为它是多部分的

认为其余部分可以(除非它没有分块,除非
req\u post.write()
正在完成该部分),例如,对于最初的第一部分:

    var req_post = https.request({
        hostname: 'host.server.com',
        path: '/ManyFiles',
        method: 'POST',
        headers: {
            'MIME-Version': '1.0',
            'Content-Type': 'multipart/mixed; boundary=' + boundary
        }
    },...);
然后是伪代码:

while ( true ) {
    // { get next file here }
    req_post.write('\r\n--' + boundary + '\r\nContent-Type: ' + filetype + '\r\nContent-Length: ' + filesize + '\r\n\r\n');
    req_post.write(chunk);// filesize
    if ( end ) {
        req_post.write('\r\n--' + boundary + '--\r\n');
        req_post.end();
        break;
    }
}

感谢您的帮助/指点

快速答案是,如果不设置内容长度,就无法禁用分块。分块编码是在您开始传输时不知道有效负载大小的情况下引入的。最初,内容长度是必需的,收件人在收到内容长度字节时知道它拥有完整的消息。分块编码通过传输每个内容长度为零的迷你有效负载,后跟零大小表示有效负载的完成,从而消除了这一要求。因此,如果您不设置内容长度,并且不使用分块方法,那么接收者将永远不会知道何时拥有完整的负载


为了帮助解决您的问题,如果您无法发送chunked并且不想在发送之前读取所有文件,请查看。您可以使用它来获取文件大小,而无需读取文件。

谢谢您的回复。我在每个MIME部分中都包含了内容长度,但即使没有,MIME边界也会发出消息结束的信号——也就是说,HTTP协议可以处理这种情况。这似乎是节点的限制,而不是HTTP…是的,这是正确的,但它需要知道何时收到整个响应(即发送了多少MIME部分)。这个维基有一个很好的解释。我建议至少通读第一部分。最后,如果您不想使用分块编码,那么必须计算并设置整个请求体的内容长度,而不仅仅是每个部分。