2012-03-02 35 views
12

我必須將文件上傳到FTP服務器。文件名包含特殊字母,例如äöü。在FTP服務器上,我需要文件名爲UTF-8編碼。Apache Commons Net中的文件名編碼FTPClient

我的代碼是這樣的:

import org.apache.commons.net.ftp.FTPClient; 

FTPClient client = new FTPClient(); 

... 

boolean retval = client.storeFile(fileName, inputStream); 

的問題是,storeFile後,保存在FTP服務器上的文件的名稱是ISO-8859-1編碼,而不是UTF-8。

我怎麼能告訴FTPClient UTF-8編碼的文件名?

+1

我會說你正在尋找錯誤的地方,這可能是在FTP服務器上的配置... – Marcelo 2012-03-02 15:36:26

+1

不一定。原來的FTP協議規範根本不支持Unicode。爲了通過FTP連接使用UTF-8,雙方必須首先同意使用它。服務器必須在FEAT命令中報告它甚至支持UTF-8(參見RFC 2640,儘管不是所有的服務器都支持該規範)。某些服務器要求客戶端發送非標準的'OPTS UTF8 ON'或'OPTS UTF-8 NLST'命令來激活UTF-8。這就是1M的問題 - FTPClient支持什麼,服務器支持什麼?我會使用一個數據包嗅探器,比如WareShark來觀察FTP流量並查看。 – 2012-03-08 01:58:28

回答

24

我沒有測試它,但你可以嘗試this

client.setControlEncoding("UTF-8"); 
+5

是的,setControlEncoding是正確的。但是,在連接之前調用setControlEncoding非常重要,否則它不起作用。我其實認爲這是一個不幸的圖書館設計,另見http://yaseb.wordpress.com/2012/03/07/apache-commons-unfortunate-design-of-ftpclient/ – gefei 2012-03-27 11:52:46

6

因爲Apache下議院NET 3.0可以使用ftpClient.setAutodetectUTF8(true);到FTP服務器上啓用的UTF-8支持自動檢測。像setControlEncoding它必須在連接之前調用。

查看相應的javadoc

相關問題