Apache Commons Net FTPClient 中的文件名编码

Posted

技术标签:

【中文标题】Apache Commons Net FTPClient 中的文件名编码【英文标题】:Filename encoding in Apache Commons Net FTPClient 【发布时间】:2012-03-21 02:40:25 【问题描述】:

我必须将文件上传到 FTP 服务器。文件名包含特殊字母,例如äöü。在 FTP 服务器上,我需要将文件名进行 UTF-8 编码。

我的代码是这样的:

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 编码?

【问题讨论】:

我说你找错地方了,这可能是FTP服务器中的配置... 不一定。最初的 FTP 协议规范根本不支持 Unicode。为了在 FTP 连接上使用 UTF-8,双方必须首先同意它的使用。服务器必须在FEAT 命令中报告它甚至支持 UTF-8(请参阅 RFC 2640,尽管并非所有服务器都支持该规范)。有些服务器要求客户端发送非标准的OPTS UTF8 ONOPTS UTF-8 NLST 命令来激活UTF-8。这就是 100 万美元的问题——FTPClient 支持什么,服务器支持什么?我会使用像 WareShark 这样的数据包嗅探器来观察 FTP 流量并进行查看。 【参考方案1】:

我没有测试过,你可以试试this:

client.setControlEncoding("UTF-8");

【讨论】:

是的,setControlEncoding 是对的。但是,在连接之前调用 setControlEncoding 很重要,否则它不起作用。我实际上认为这是一个不幸的库设计,另见yaseb.wordpress.com/2012/03/07/… 另请注意,如果您的服务器是 Windows IIS FTP 服务器,则服务器上允许 UTF8 的事实并不意味着它将用于连接,除非在连接后,您另外发出OPTS UTF8 ON 命令:client.sendCommand("OPTS UTF8 ON");【参考方案2】:

由于 Apache Commons NET 3.0 可以使用ftpClient.setAutodetectUTF8( true ); 来启用对 FTP 服务器上 UTF-8 支持的自动检测。像setControlEncoding 一样,必须在连接之前调用它。

查看对应的javadoc。

【讨论】:

以上是关于Apache Commons Net FTPClient 中的文件名编码的主要内容,如果未能解决你的问题,请参考以下文章

JAVA-使用Commons Net连接FTP

maven中,POM.XML中怎么配置org.apache.commons.net.ftp引用包,求配置代码- -

[Java] 使用 Apache的 Commons-net库 实现FTP操作

org.apache.commons.net.MalformedServerReplyException: Could not parse response code. Server Reply: S

org.apache.commons.net.MalformedServerReplyException: Could not parse response code. Server Reply: S

org.apache.commons.net.MalformedServerReplyException: Could not parse response code. Server Reply: S