2011-01-19 55 views
6

我該如何在java.Currently中設置本地化文件名每次我點擊一個本地化文件,在我的應用程序中有一個非ASCII文件名,窗口保存對話框彈出,但它沒有正確顯示文件名,如果字符集是高於ISO-88859-1的任何字符。Java本地化文件名

這是我保存文件的代碼。

  InputStream inputStream = null; 
try { 
    response.resetBuffer(); 
    response.setContentType(fileStream.getContentType()); 
    response.setContentLength((int) fileStream.getContentLength()); 
    response.addHeader("Content-Disposition", 
    "attachment;filename=\"" + fileName + "\""); 
    ServletOutputStream stream = response.getOutputStream(); 
    byte[] buffer = new byte[1024]; 
    int read = 0; 
    int total = 0; 
    inputStream = fileStream.getInputStream(); 
    while ((read = inputStream.read(buffer)) > 0) { 
    stream.write(buffer, 0, read); 
    total += read; 
    } 
    response.flushBuffer(); 
} finally { 
    if (inputStream != null) { 
    inputStream.close(); 
    } 
} 

如果有人能就如何解決此問題分享他們的想法,我會非常有幫助。 在此先感謝。

回答

13

gustafc說的是正確的,但它並沒有讓你到達你想要的位置。 RFC 2231允許您使用非ASCII Content-TypeContent-Disposition參數的替代格式,但並非所有瀏覽器都支持它。這是最有可能在上班的路上,不幸的是,忽略什麼RFC 2183說,並在迴應中使用RFC 2047 encoded-words

response.addHeader("Content-Disposition", "attachment; " + 
    "filename=\"" + MimeUtility.encodeWord(fileName, "utf-8", "Q") + "\""); 

注意,這可能不適用於所有瀏覽器。 IE的一些變型要求URL編碼,而不是值:用檢測組合

response.addHeader("Content-Disposition", 
    "attachment; filename=" + URLEncoder.encode(filename, "utf-8")); 
2

section 2.3 in the spec,看來你不能使用非US-ASCII字符:

當前[RFC 2045]語法限制參數值(並因此 內容配置文件名),以US-ASCII。我們認識到允許在文件名中使用任意字符集的好處 ,但是 定義必要的 機制超出了本文檔的範圍。我們預計基本的[RFC 1521]「值」 規範將在某一天被修改爲允許使用非US-ASCII 字符,此時應在 Content-Disposition文件名參數中使用相同的機制。

+0

這是準確的,但無濟於事。 :) – dkarp 2011-01-19 16:43:43

+0

Gustafc,感謝您的時間和RFC的指出這些不良結果的原因。 – Hitatichi 2011-01-20 07:19:35

4

我面臨類似的問題與含有希臘語characters.I文件名中使用的(我的感謝dkarp)上面的回答所提供的代碼瀏覽器被使用。這是結果:

 
String user_agent = request.getHeader("user-agent"); 
boolean isInternetExplorer = (user_agent.indexOf("MSIE") > -1); 
if (isInternetExplorer) { 
    response.setHeader("Content-disposition", "attachment; filename=\"" + URLEncoder.encode(filename, "utf-8") + "\""); 
} else { 
    response.setHeader("Content-disposition", "attachment; filename=\"" + MimeUtility.encodeWord(filename) + "\""); 
} 

我測試了它與Firefox 3.6,鉻10.0和Internet Explorer 8,它似乎工作正常。

1

雖然這是個老問題,但它仍然是實際的。我發現適用於所有瀏覽器的解決方案。

見我在其他主題發表:
Java servlet download filename special characters

總之,瀏覽器預計filename參數值在瀏覽器中編碼本地編碼(如果filename參數沒有指定字符集不同)。瀏覽器的本地編碼通常是utf-8(FF,Opera,Chrome),但對於IE而言,它是win-1250。因此,如果我們將價值放入filename參數中,那麼根據用戶的瀏覽器將其編碼爲utf-8/win-1250,它應該可以工作。

例如,如果我們有文件名爲omáčka.xml
對於Firefox,Opera和鉻I反應此標頭(編碼UTF-8):

Content-Disposition: attachment; filename="omáčka.xml" 

和用於IE I反應此標頭(編碼在Win-1250):

Content-Disposition: attachment; filename="omáèka.jpg" 

Java示例是上述in my post

注#1(@dkarp)

注意使用URLEncoder.encode(),因爲這種方法不編碼輸入字符串爲網址編碼的。此方法將輸入字符串編碼爲非常類似的表單編碼,但在某些情況下會有所不同 - 例如空格字符''編碼爲'+'而不是'%20'。

進行正確的URL編碼,你應該寧願使用URI類:

URI uri = new URI(null, null, "foo-ä-€.html", null); 
System.out.println(uri.toASCIIString());