解决FTPClient不能访问文件的问题150 Opening ASCII mode data connection

问题描述

我使用的FTPClient:import org.apache.commons.net.ftp.FTPClient;

java中下载FTP文件,但是

FTP登录成功,FTPClient访问文件,却卡住。

代码(伪代码):

boolean res = f.login();

FTPFile[] list = f.ftp.listFiles("/");

打印日志:

220 Serv-U FTP Server v6.4 for WinSock ready...
USER zhhzhx
331 User name okay, need password.
PASS Its.info
230 User logged in, proceed.
登陆成功
SYST
215 UNIX Type: L8
PORT 192,168,1,106,213,244
200 PORT Command successful.
LIST /
150 Opening ASCII mode data connection for /bin/ls.


解决思路

FTP是有两种数据连接模式的,主动模式和被动模式。

PORT(主动)方式:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据。

PASV(被动)方式的连接过程是:
客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。

ftp默认为port主动模式,如果客户端pc所在网络有防火墙,则ftp server在数据传输时,就不能连接到client。


解决方法

修改为被动方式。

java中修改:ftp.enterLocalPassiveMode();

FTP工具,一般都可以在选项里面找到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FTPClient是Java提供的一个用于进行FTP文件传输的类库,其中的listFiles方法可以用来列出FTP服务器上指定目录下的所有文件。如果在使用这个方法时出现部分文件读取不到的情况,那可能是由于以下几方面原因所导致的。 1. 文件命名问题 FTP服务器上可能存在一些文件名中含有特殊字符或者重名的情况,这些文件名就会对FTPClient的listFiles方法造成影响。因为FTP协议使用的是ASCII编码方式并且不能使用UTF-8,所以如果文件名中含有非ASCII字符或者中文等,FTPClient就无法正确解析这些文件名,从而出现读取不到文件的情况。 2. 文件权限问题 FTP服务器的设置可能会限制FTPClient对某些文件访问权限,比如某些文件已经被设置为只读或者需要特定的权限才能访问等。这种情况下,FTPClient的listFiles方法就会读取不到这些文件,而文件列表的返回结果也可能会受到权限控制的影响。 3. 文件路径问题 FTPClient的listFiles方法在列出FTP服务器上的所有文件时,需要指定要列出的目录路径。如果目录路径设置不正确或者指定了错误的目录路径,那么就会出现部分文件读取不到的情况。此时可以通过打印FTPClient返回的日志信息或者使用FTPClient.changeWorkingDirectory方法来查看目录路径是否正确。 解决这个问题的方法,可以尝试以下几种措施: 1. 修改FTP服务器上的文件名,将文件名中含有特殊字符或者重名的文件修改为合法的文件名。 2. 检查FTP服务器上的文件权限,为FTPClient访问授权或者修改FTP服务器上文件访问权限。 3. 检查FTPClient的目录路径是否正确,保证要列出的目录路径是合法的。 综上所述,FTPClient.listfiles一部分文件读取不到可能是由文件命名问题文件权限问题或者文件路径问题所导致的。要解决这个问题,可以通过修改FTP服务器上的文件名、调整FTP服务器上的文件权限或者检查FTPClient的目录路径是否正确等方法来进行处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值