ftp list 空 java,Java FTPClient listFiles返回带有Unicode路径的空结果

我试图从ftp服务器获取列表

并有编码问题

FTPClient.listfiles(String path)方法

如果路径包含非拉丁字符,则其始终返回空数组.

(我也使用带有python和perl脚本的服务器,也使用unicode-并且没有类似的问题)

请帮助解决此问题.

这种与调试输出连接的方法:

public static FTPClient ftpConnect(String host, String login, String password) throws IOException {

FTPClient ftp = new FTPClient();

FTPClientConfig config = new FTPClientConfig();

ftp.configure(config);

debug(ftp.getReplyString());

debug("Connected to " + host + ".");

ftp.connect(host);

debug(ftp.getReplyString());

debug("Set passive transfer mode");

ftp.enterLocalPassiveMode();

debug(ftp.getReplyString());

debug("Login to " + host + ".");

ftp.login(login, password);

debug(ftp.getReplyString());

int reply;

ftp.setControlEncoding("UTF-8");

ftp.setAutodetectUTF8(true);

ftp.setFileType(FTPClient.BINARY_FILE_TYPE);

debug("Set binary transfer mode");

debug(ftp.getReplyString());

debug("Buffer size = " + ftp.getBufferSize());

// After connection attempt, you should check the reply code to verify

// success.

reply = ftp.getReplyCode();

if (!FTPReply.isPositiveCompletion(reply)) {

ftp.disconnect();

debug("FTP server refused connection.");

throw new IOException("FTP server refused connection.");

}

return ftp;

}

这里连接输出:

Connected to ftp.server.com.

220 FTP Server

220 FTP Server

Login to ftp.server.com.

230 Login successful.

Set binary transfer mode

200 Switching to Binary mode.

Set passive transfer mode

200 Switching to Binary mode.

Buffer size = 1024

这里有一些例子:

String source = "/english_name/Новая_папка12"; // non_latin path

String escaped_source = StringEscapeUtils.escapeJava(source);

FTPFile[] file_list = ftp.listFiles(escaped_source); // empty

file_list = ftp.listFiles(escaped_source + '/'); // empty

file_list = ftp.listFiles(source); // empty

file_list = ftp.listFiles('"' + source + '"'); // empty

file_list = ftp.listFiles(source + '/'); // empty

file_list = ftp.listFiles("/english_name"); // ok, but its another path

解决方法:

我希望有人回答,但是那天我自己解决了这个问题=)

希望对某人有用.

解决方案是:

String encoded = new String(utf8_path.getBytes("UTF-8"), "ISO-8859-1");

FTPFile[] file_list = ftp.listFiles(encoded);

// win!

标签:unicode,apache,ftp,java

来源: https://codeday.me/bug/20191123/2066343.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ftpclient.listfiles可能是因为FTP服务器上没有文件或目录,或者连接FTP服务器失败。您可以检查FTP服务器上是否有文件或目录,以及确保您的FTP客户端已经成功连接到FTP服务器。如果问题仍然存在,您可以尝试重新启动FTP客户端或FTP服务器,并检查FTP客户端的配置是否正确。 ### 回答2: FTPClientJava程序中一个常用的FTP客户端库,它提供了一系列的接口函数,可以实现FTP协议的各种操作,如上传、下载、删除、重命名、获取远程目录信息等。使用FTPClient获取远程目录信息时,可以通过调用listFiles()函数来获取目录列表,但是有时候我们会遇到listFiles()函数返回的情况,这可能是由以下几点原因引起的。 1. 连接失败 在使用FTPClient进行操作时,首先需要连接FTP服务器。如果连接失败,listFiles()函数会返回一个的数组。连接失败的原因可能是FTP服务器地址、端口、用户名、密码等配置信息错误,或者服务器处于闲置状态等等。 2. 登录失败 如果连接成功,但登录失败,listFiles()函数也会返回数组。登录失败的原因可能是用户名、密码错误,或者没有权限访问FTP服务器中的目录。 3. 路径错误 当FTP服务器端的路径设置有误时,listFiles()函数也会返回数组。这时候需要检查程序中访问的远程目录路径是否与实际情况相符合。 4. 服务器返回的信息格式不正确 在进行FTP操作时,客户端和服务器之间会进行数据交换。如果服务器返回的信息格式不正确,解析数据时会出现错误,导致listFiles()函数返回数组。 5. 连接未关闭 如果FTPClient连接还未关闭,而我们在不同的线程中进行连接时,可能会导致listFiles()函数返回数组,因为多个线程可能会互相干扰。 综上所述,当listFiles()函数返回时,我们应该仔细检查代码中的FTP连接、登录、路径设置、服务器返回信息等情况,以确定具体的问题原因,并做出相应的处理。 ### 回答3: FTPClientJava中用于连接FTP服务器的工具类,可以实现文件的上传、下载、重命名等操作。在使用FTPClient时,有时我们会遇到ftpclient.listfiles的情况。 造成ftpclient.listfiles可能的原因如下: 一、连接的FTP服务器路径有误,可能是路径拼写错误或FTP服务器 IP 出错,这样连接会失败,进而会导致 listfiles() 方法返回。 解决方法:检查连接的 FTP 服务器 IP,以及客户端访问该服务器的路径路径名是否正确。 二、FTP服务器本身问题,如果连接的FTP服务器出现异常情况,如停机维护等,那么就会导致ftpclient.listfiles。 解决方法:等待 FTP 服务器重启完毕后再试。 三、FTP客户端主机的防火墙或安全软件把客户端IP地址拦截了,导致FTP控制连接失败。 解决方法:关闭防火墙或安全软件的拦截,或者手动添加FTP客户端IP地址的白名单。 四、FTP服务端配置问题,如权限不足。 解决方法:检查FTP服务端配置,获取更高的权限。 以上是可能导致FTPClient.listfiles的原因,根据具体情况进行调查和排查。如果以上解决方法不能解决问题,可以查看 FTP 服务器日志,获取更详细的错误日志信息,找到原因再解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值