2016-11-24 61 views
0

我正在使用WebClient將項目上傳到Web應用程序。如何在使用WebClient的SLUG標題中設置編碼

我試着用下面的代碼,但服務器不能識別在slug頭文件中定義的特殊字符,並用其他不可打印的字符替換它們。

WebClient.Headers.Clear(); 
WebClient.Headers.Add("Content-Type",GetMimeType(Path.GetExtension("aáñÑ.pdf"))); 
WebClient.Headers.Add("Accept", "*/*"); 
WebClient.Headers.Add("Referer", myRefererURL); 
WebClient.Headers.Add("x-csrf-token", "securityTokenFromModel"); 
WebClient.Headers.Add("slug", "aáñÑ.pdf"); 

而且,讀RFC2047(http://www.ietf.org/rfc/rfc2047.txt)後,我替換爲下面的代碼的最後一行,但服務器無法識別該請求並返回一個錯誤。

WebClient.Headers.Add("slug", "(=?ISO-8859-1?q?" + "aáñÑ.pdf" + "?=)"); 

有另一種方式來設置enconding字符集,允許在塞頭使用特殊字符(重音,西班牙字符)?

編輯:

閱讀@Julian的答案後,我試圖改變Slug頭看起來像這樣:

WebClient.Headers.Add("slug", "The Beach at S%C3%A8te"); 

但Web應用程序恰好設置文件名:「在S%海灘C3%A8te」。

在另一個試驗,這是提琴手是如何顯示文件名使用 「DocumentaciónÑñ.docx」 的要求:

請求由Internet Explorer 11發:OK

Request made by Internet Explorer 11: OK

請求通過.NET做Web客戶端和谷歌Chrome:ERROR

enter image description here

+0

有你試圖逃跑由'System.Web.HttpUtility蛞蝓值.HtmlEncode()'?我的意思是像WebClient.Headers.Add(「slug」,「(=?ISO-8859-1?q?」+ System.Web.HttpUtility.HtmlEncode(「aáñÑ.pdf」)+ 「?=)」);'This。 –

+0

謝謝@Ali,但它不起作用。使用WebClient.Headers.Add(「slug」,「(=?ISO-8859-1?q?」+ System.Web。 HttpUtility.HtmlEncode(「aáñÑ.pdf」)+「?=)」);從服務器返回一個錯誤並使用WebClient.Headers.Add(「slug」,「(System.Web.HttpUtility.HtmlEncode(」aáñÑ.pdf 「));使用編碼字符設置文件名。 –

+0

我認爲你需要在發送之前將文件名編碼到「ISO-8859-1」中。檢查此:http://stackoverflow.com/questions/629617/how-to-convert-string-to-iso-8859-1 –

回答

1

答案是在SP定義:

「字段值是要包含的字符序列的UTF-8編碼的百分比編碼值(有關定義百分比編碼的內容,請參見[RFC3986]的第2.1節;關於[RFC3629]定義UTF-8編碼)。

執行注意事項:要從字符序列中產生字段值,首先使用UTF-8編碼對其進行編碼,然後使用百分比編碼對範圍%20-24和%26-7E之外的所有八位字節進行編碼(%25是「%」的ASCII編碼,因此它需要被轉義)。消耗的域值,第一扭轉百分號編碼,然後通過UTF-8解碼處理運行生成的八位位組序列。」

https://greenbytes.de/tech/webdav/rfc5023.html#rfc.section.9.7.1

+0

感謝您的回答我編輯了問題以顯示我做的另一個測試的結果 –

+0

當你說「設置文件名」時,你指的是什麼?創建的資源的URI?在這種情況下,服務器會 –

+0

我的意思是上傳的文件在服務器上得到「S%C3%A8te的海灘」作爲它的文件名(帶有百分號和數字),我認爲這些應該被替換爲它們對應的拉丁字符集中的特殊字符 –