2012-03-02 36 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

相关问题