我正在尝试将多个二进制文件发送到单个多部分/混合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;
}
}
感谢任何帮助/指示!
答案 0 :(得分:0)
快速回答是,如果不设置内容长度,则无法禁用分块。对于在开始传输时不知道有效负载大小的情况,引入了分块编码。最初,内容长度是必需的,并且收件人知道它在收到内容长度字节时有完整的消息。分块编码通过发送每个具有内容长度的小有效载荷,随后是零大小来表示有效载荷的完成,从而消除了该要求。因此,如果您没有设置内容长度,并且您没有使用分块方法,则收件人永远不会知道它何时具有完整的有效负载。
为了帮助解决您的问题,如果您无法发送分块并且不想在发送之前阅读所有文件,请查看fs.stat。您可以使用它来获取文件大小而无需读取文件。