2011-03-23 219 views
0

我試圖通過客戶端應用程序的HTTP 1.1 POST將文件上傳到ASP 2.0 Web服務。如果我的Web服務函數聲明爲使用HTTP/1.1 POST將文件上傳到ASP web服務

<WebMethod()> 
Public Function UploadFile(ByVal file as Byte(), ByVal fileName as String) as String 
... 

測試窗體說,請求應該採取這種形式:

POST address_of_service HTTP/1.1 
Host: <host> 
Content-Type: application/x-www-form-urlencoded 
Content-Length: length 

file=string&file=string&fileName=string 

如何讓我的二進制文件數據轉換成這種形式?我試過只是將文件數據轉換爲字符串並將其放入主體(file=<string_data_here>),但我得到HTTP 500錯誤,抱怨無法將其轉換爲System.Byte。我的HTTP POST在我的應用程序中的其他地方使用純字符串參數正常工作。

另外,出於好奇,它爲什麼顯示文件參數兩次?

+0

我認爲上傳文件需要將表單enctype設置爲「multipart/form-data」 – Swaff 2011-03-23 15:56:25

回答

2

將二進制流轉換爲基於Base64的字符串,並使用Post將其傳遞給webservice。當webservice接收到執行調用時,您可以從Base64字符串轉換回原始二進制數組序列。

請參閱以下內容;

將文件轉換爲Base64字符串爲POST;

var fileStream = File.Open(<your file path>, FileMode.Open, FileAccess.Read); 
var reader = new BinaryReader(fileStream); 
var data = new byte[fileStream.Length]; 
reader.Read(data, 0, data.Length); 
var strBase64 = Convert.ToBase64String(data, 0, data.Length); 

將其轉換爲二進制的SOAP Web服務方法:

var data = Convert.FromBase64String(<your webmethod input Base64 string>); 

免責聲明:我提供了這個例子,無需機會測試它編譯,但它應該有希望在你點正確的方向來完成您的要求。

+0

這讓我走得更遠,但Convert.FromBase64String調用在服務器端失敗,因爲它的「基地長度無效-64字符數組「。 – 2011-03-23 16:36:50

+0

@Tom:base64字符串的長度必須是0或4的倍數是有效的。確保Convert.ToBase64String的長度參數設置正確。就像我說的,我現在沒有機器在我面前進行測試,但如果你仍然陷入困境,以後會看看。 – 2011-03-23 16:41:28

+0

我認爲這只是一個字符串編碼問題(通過網絡);如果我將生成的客戶端字符串硬編碼到服務器端代碼中,它會保存一個有效的圖像。我想我現在可以弄明白了。 – 2011-03-23 17:09:14

相關問題