2014-03-01 55 views
0

我目前正在編寫一個解析原始HTTP請求的HTTP庫。一切都很順利,直到我開始處理文件上傳。以下摘錄是我的瀏覽器發送到服務器的內容。C#處理HTTP文件上傳

POST/HTTP/1.1 
Host: 127.0.0.1:4588 
Connection: keep-alive 
Content-Length: 298 
Cache-Control: max-age=0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Origin: null 
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)   Chrome/33.0.1750.117 Safari/537.36 
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryhbdh0xLSA8wBoWuq 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 

------WebKitFormBoundaryhbdh0xLSA8wBoWuq 
Content-Disposition: form-data; name="NAMEFile"; filename="TestData.png" 
Content-Type: image/png 

<PNG File as bytes> 
------WebKitFormBoundaryhbdh0xLSA8wBoWuq 
Content-Disposition: form-data; name="submit" 

Submit 
------WebKitFormBoundaryhbdh0xLSA8wBoWuq-- 

目前,我讀的要求,把它變成一個字符串的一切分裂,然後計算出如果任何身體使用Content-Length頭缺失,並等待身體的其他部分來如果需要的話。我的觀點是,我確信整個郵件正文到達服務器。我也知道我已經使用Content-Type中指定的邊界精確地分割了正文。

我的問題如何將上面代碼中標記爲「PNG文件爲字節」的身體部分轉換爲字節[]?

以前,我曾嘗試通過每個字符循環和增加它的值,以一個字節數組例如炭的foreach下在bytelist.add((字節)C)

這樣做後,我比較了原始文件和發現大部分字符已被63(ASCII碼代替?)代替,這意味着我可能覆蓋127以上的任何字節(我認爲這是ASCII的最大值?),而63代替。然後我推測我使用了錯誤的編碼,但是UTF8使我很難計算出我有多少數據,而不是我應該預期的數量,這導致了另一個問題,UTF8字符使用了多少個字節?

所有幫助表示讚賞!

+0

你想重新創建一個原始請求(你變成了一個字符串)的PNG? – LGSon

+0

是的,我想這反過來意味着......我可以使用什麼編碼來確保字符串中的每個字符都保持其字節值,以便我可以重新創建PNG? –

+0

你不能使用'Request.Files'屬性來檢查png內容的長度並將其直接保存到磁盤嗎? – LGSon

回答

0

我找到了問題的答案。我的方法背後的問題是我推測每個Unicode字符都使用與其他字節相同數量的字節。這是不正確的。這反過來導致我等待接收的字節數正確的while循環永遠等待。

對於任何嘗試類似的人,我設法通過編寫一個函數來解決這個問題,該函數通過作爲第二個字節數組給出的分隔符​​來分割字節數組。這幫助我將原始字節數組拆分爲多個部分,其中一個是上傳的文件。