一、ftpClient.enterLocalPassiveMode()
publicstaticfinalintPASSIVE_LOCAL_DATA_CONNECTION_MODE=2;
官网关于该常量的说明:
AconstantindicatingtheFTPsessionisexpectingalltransferstooccurbetweentheclient(local)andserverandthattheserverisinpassivemode,requiringtheclienttoconnecttotheserver'sdataporttoinitiateatransfer
官网关于该方法的说明:
SetthecurrentdataconnectionmodetoPASSIVE_LOCAL_DATA_CONNECTION_MODE.Usethismethodonlyfordatatransfersbetweentheclientandserver.ThismethodcausesaPASV(orEPSV)commandtobeissuedtotheserverbeforetheopeningofeverydataconnection,tellingtheservertoopenadataporttowhichtheclientwillconnecttoconductdatatransfers.TheFTPClientwillstayinPASSIVE_LOCAL_DATA_CONNECTION_MODEuntilthemodeischangedbycallingsomeothermethodsuchasenterLocalActiveMode()。
翻译如下:
将当前数据连接模式设置为被动本地数据连接模式。此方法仅用于客户端和服务器之间的数据传输。此方法导致在打开每个数据连接之前向服务器发出一个PASV(或EPSV)命令,告诉服务器打开一个数据端口,客户端将连接到该端口进行数据传输FTPClient将保持被动本地数据连接模式,直到通过调用enterLocalActiveMode()等其他方法更改模式为止。
二、ftpClient.listFiles()返回null
1、检查当前工作目录是否正确:
ftpClient.printWorkingDirectory();
若工作目录不正确,需切换目录:
ftpClient.changeWorkingDirectory(inpath);
2、检查文件传输模式是否是被动模式:
在ftpClient.listFiles();之前添加:
ftpClient.enterLocalPassiveMode();
三、ftpClient.retrieveFileStream(Stringfilename)返回null
for(FTPFileftpFile:ftpFiles){
inputStream=ftpClient.retrieveFileStream(ftpFile.getName());
//...省略其他代码
};
该代码只能成功下载第一个文件,从第二个文件开始inputStream都是null,原因如下:
在每次执行完下载操作之后,completePendingCommand()会一直在等FTPServer返回226Transfercomplete,但是FTPServer只有在接受到InputStream执行close方法时,才会返回。所以一定先要执行close方法。不然在第一次下载一个文件成功之后,之后再次获取inputStream就会返回null。
所以需要修改代码如下:
for(FTPFileftpFile:ftpFiles){
inputStream=ftpClient.retrieveFileStream(ftpFile.getName());
//...省略其他代码
inputStream.close();
ftpClient.completePendingCommand();
};
四,带证书的FTPSClient使用
原文链接:https://blog.csdn.net/qq_34721505/article/details/102937725