2014-04-17 32 views
0

我試圖發送多個二進制文件到單個多部分/混合POST中的Web服務,但似乎無法讓它工作...目標服務器拒絕它。有一兩件事我注意到的是節點試圖做編碼爲分塊,這是我不想:非分塊multipart/mixed POST?

POST /SomeFiles HTTP/1.1 
MIME-Version: 1.0 
Content-Type: multipart/mixed; boundary=123456789
Host: host.server.com 
Connection: keep-alive 
Transfer-Encoding: chunked 

我如何得到它停止被分塊? Docs表示可以通過在主請求頭中設置Content-Length來禁用它,但我無法設置Content-Length,因爲我一次加載一個文件 - 但它不應該因爲它是多部分的,所以需要它們。

認爲其餘的是好的(除非它沒有分塊,除非req_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; 
    } 
} 

任何幫助/指針表示讚賞!

回答

0

快速的回答是你不能禁用分塊而不設置內容長度。分塊編碼是在您開始傳輸時不知道有效載荷大小的情況下引入的。最初,內容長度是必需的,收件人知道它收到內容長度字節時已收到全部消息。分塊編碼通過傳輸每個內容長度的小型有效載荷來消除該要求,然後以零大小表示有效載荷的完成。因此,如果您沒有設置內容長度,並且您沒有使用分塊方法,則收件人將永遠不知道它何時具有完整的有效內容。

爲了幫助解決您的問題,如果在發送之前無法發送分塊文件並且不想讀取所有文件,請查看fs.stat。您可以使用它在不讀取文件的情況下獲取文件大小。

+0

感謝您的回覆。我在每個MIME部分都包含了Content-Length,但即使沒有,MIME邊界也會標示消息的結束 - 也就是說,HTTP協議處理這種情況的確定。這似乎是Node的限制,而不是HTTP ... – mark

+0

是的,這是正確的,但它需要知道整個響應何時被接收(即發送了多少個MIME部分)。這個wiki有一個很好的解釋。我建議至少閱讀第一部分。 http://en.wikipedia.org/wiki/Chunked_transfer_encoding。最終,如果你不想分塊編碼,你必須在整個請求體上計算和設置內容長度,而不僅僅是每個部分。 –