【问题标题】:Filename encoding in Apache Commons Net FTPClientApache 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 流量并进行查看。

标签: java utf-8 ftp apache-commons-net


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-06-11
    • 2023-04-05
    • 2015-01-17
    • 2012-09-30
    • 2014-03-26
    • 2021-04-10
    • 2012-05-22
    • 2016-03-16
    • 2012-03-31
    相关资源
    最近更新 更多