2010-09-25 11 views
2

我使用ActionScript引擎上傳文件時,發動機將選擇文件並通過網絡直通HTTP POST命令發送的文件,該文件說,POST消息是這樣的:如何解析HTTP POST(文件上傳)流?

POST /handler.cfm HTTP/1.1 
    Accept: text/* 
    Content-Type: multipart/form-data; 
    boundary=----------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
    User-Agent: Shockwave Flash 
    Host: www.example.com 
    Content-Length: 421 
    Connection: Keep-Alive 
    Cache-Control: no-cache 

    ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
    Content-Disposition: form-data; name="Filename" 

    MyFile.jpg 
    ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
    Content-Disposition: form-data; name="photo"; filename="MyFile.jpg" 
    Content-Type: application/octet-stream 

    FileDataHere 
    ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
    Content-Disposition: form-data; name="Upload" 

    Submit Query 

    ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7-- 

在服務器端我有一個C++程序偵聽端口80並解析POST消息。我只想要文件名和文件數據。如何使用C++解碼文件數據,它是base64編碼的,有沒有一個庫可以爲我做?我想解碼二進制文件,並將其寫入文件,謝謝!

+0

如果你沒有提供HTML的提交按鈕的名稱,它不會被髮送到服務器(「上傳」部分:) :) – pmg 2010-09-25 15:25:14

回答

5

不,沒有編碼。多部分消息的每個子部分的主體都包含在逐字節字節中。因此,您必須小心選擇文件數據中不存在的boundary字符串。

要解析的multipart/form-data的形式提交你會夠MIME解析器解析頭,挑出你想要一個像boundaryname參數,並通過邊界字符串分割收到的消息。這不是微不足道的,所以你可能想要consider existing libraries。 (不幸的是,瀏覽器在HTTP中實際執行的操作與RFC 1341中列出的標準MIME規則有所不同,特別是,字段名和文件名參數往往包含非ASCII字符和未轉義的引號,但如果您生成。張貼自己希望你可以避開爭奪這些地區的)

1

在沒有「Content_Transfer_Encoding」頭的,假定數據被編碼在「7位」(RFC 1521; RFC 1867; RFC 2616)。

我不知道如果tere的C庫解析/解碼HTTP POSTs。我很肯定,雖然有:)

+0

哦,老兄,我真的來到這裏看不到C++,但特別是C庫解析邊界數據,我也很確定有一些。 – 2016-09-22 08:03:56