2011-03-09 36 views
5

我發送文件到服務器作爲八位字節流,我需要指定頭中的文件名:發送非ASCII文本

String filename = "«úü¡»¿.doc" 
URL url = new URL("http://www.myurl.com"); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setRequestMethod("POST"); 
conn.addRequestProperty("Accept", "application/json; charset=UTF-8"); 
conn.addRequestProperty("Content-Type", "application/octet-stream; charset=UTF-8"); 
conn.addRequestProperty("Filename", filename); 
// do more stuff here 

的問題是,一些我需要發送的文件具有包含非ASCII字符的文件名。我已經讀過,您不能在HTTP標頭中發送非ASCII文本。

我的問題是:

  1. 你可以在HTTP標頭中發送非ASCII文本?
  2. 如果可以,你是如何做到這一點的?當文件名包含非ASCII文本時,上面的代碼不起作用。服務器以「錯誤請求400」響應。
  3. 如果您不能,典型的 方法是什麼來解決這個限制?

回答

4

在HTTP頭不能使用非ASCII字符,請參見RFC 2616 URI本身由RFC 2396標準,不允許非ASCII無論是。 RFC說:

URI語法的設計與全球可轉錄性爲其主要關注的 其中之一。 URI是來自有限集 的一系列字符,即基本拉丁字母的字母,數字, 和一些特殊字符。

爲了在URI中使用非ASCII字符,您需要使用%hexcode語法(請參閱RFC 2396第2節)轉義它們。

在Java中,您可以使用java.net.URLEncoder類來完成此操作。

+0

嗯,仍然沒有工作。我做了:conn.addRequestProperty(「文件名」,URLEncoder.encode(文件名)); – guest99 2011-03-09 21:59:28

1

其實,你可以在頭使用非ASCII字符(請參閱RFC 2616):

message-header = field-name ":" [ field-value ] 
    field-name  = token 
    field-value = *(field-content | LWS) 
    field-content = <the OCTETs making up the field-value 
        and consisting of either *TEXT or combinations 
        of token, separators, and quoted-string> 

    TEXT   = <any OCTET except CTLs, 
        but including LWS> 

    CTL   = <any US-ASCII control character 
        (octets 0 - 31) and DEL (127)> 

    LWS   = [CRLF] 1*(SP | HT) 

    CRLF   = CR LF 

    CR    = <US-ASCII CR, carriage return (13)> 

    LF    = <US-ASCII LF, linefeed (10)> 

    SP    = <US-ASCII SP, space (32)> 

    HT    = <US-ASCII HT, horizontal-tab (9)> 
+1

RFC 2616表示您只能在HTTP標頭中使用US-ASCII。其他字符必須進行編碼。 – saille 2011-05-18 23:24:04