非分块多部分/混合POST?

时间:2014-04-17 22:12:56

标签: node.js

我正在尝试将多个二进制文件发送到单个多部分/混合POST中的Web服务,但似乎无法使其工作...目标服务器拒绝它。我注意到的一件事是Node正在尝试将编码作为chunked,我不想要这样做:

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

如何让它停止分块? Docs说可以通过在主请求标头中设置Content-Length来禁用,但我无法设置Content-Length,因为其他原因,我一次只加载一个文件 - 但它不应该被要求,因为它是多部分的。

认为其余的都没问题(除非req_post.write()正在执行该部分,否则它不会被分块),例如对于初始部分I:

    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;
    }
}

感谢任何帮助/指示!

1 个答案:

答案 0 :(得分:0)

快速回答是,如果不设置内容长度,则无法禁用分块。对于在开始传输时不知道有效负载大小的情况,引入了分块编码。最初,内容长度是必需的,并且收件人知道它在收到内容长度字节时有完整的消息。分块编码通过发送每个具有内容长度的小有效载荷,随后是零大小来表示有效载荷的完成,从而消除了该要求。因此,如果您没有设置内容长度,并且您没有使用分块方法,则收件人永远不会知道它何时具有完整的有效负载。

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