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 ON
或OPTS 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 中的文件名编码的主要内容,如果未能解决你的问题,请参考以下文章
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