Apache Commons FTPClient 登录
Apache Commons FTPClient Loggin
我正在使用 org.apache.commons.net.ftp.FTPSClient 将文件上传到 FTPS 服务器(超过 TLS/SSL)。
注意FTP服务器位于Windows服务器上,证书是自签的,在我接受了警告后可以通过FileZilla连接成功上传文件证书无效。
但是 java 处理相同内容的代码不起作用。我在代码中分别检查了连接步骤和登录步骤,发现错误发生在连接步骤 (ftps.connect(server,port)) 之后 - 日志 "Connected to server:port" 已打印在控制台中。我很困惑应该在已经完成的连接步骤中处理 getRemoteAddress。
String ftpsServer = "host";
int ftpsPort = 21;
String ftpsUser = "domain\username";
String ftpsPass = "password";
try{
FTPSClient ftpClient = new FTPSClient();
ftpClient.connect(ftpsServer,ftpsPort);
// check FTP connection
int reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)){
ftpClient.disconnect();
System.err.println("FTP server refused connection.");
System.exit(1);
} else {
System.out.println("Connected to " + ftpsServer + ":" + ftpsPort + ".");
}
// check FTP login
if (ftpClient.login(ftpsUser, ftpsPass)){
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
System.out.println("Logged into FTP server successfully");
} else {
System.out.println("Failed log into FTP server");
ftpClient.logout();
ftpClient.disconnect();
}
File localFile = new File("C:/test/history.txt");
InputStream inputStream = new FileInputStream(localFile);
boolean uploaded = ftpClient.storeFile("/wwwroot/preview/history.txt", inputStream);
System.out.println("uploaded successful? " + uploaded);
inputStream.close();
ftpClient.logout();
ftpClient.disconnect();
}catch(Exception e){
LOG.error("Exception when merging Reminderlist is: ", e);
}
控制台打印的完整日志是:
Connected to 10.20.254.xx:21.
Failed log into FTP server
ERROR 2017-10-13 15:27:15,322 [main]
com.redwood.contentmanagement.UnzipFiles: Exception when merging
Reminderlist is:
java.lang.NullPointerException
at
org.apache.commons.net.SocketClient.getRemoteAddress(SocketClient.java:553) ~[commons-net-2.2.jar:2.2]
at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:509) ~[commons-net-2.2.jar:2.2]
at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:425) ~[commons-net-2.2.jar:2.2]
at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:1548) ~[commons-net-2.2.jar:2.2]
at com.redwood.contentmanagement.TransferOverFTPS.myTransform(TransferOverFTPS.java:55) ~[classes/:?]
at com.redwood.contentmanagement.TransferOverFTPS.main(TransferOverFTPS.java:110) ~[classes/:?]
非常感谢@devpuh的回复,我在用户名中将\改为/后登录成功,但是上传文件还是失败,也没有详细说明失败的地方,下面是完整的登录控制台:
Connected to 10.20.254.10:21.
Logged into FTP server successfully
uploaded successful? false
对于原题
您的登录凭据不正确,但您仍在尝试上传文件。
您必须妥善处理错误登录。例如:
// check FTP login
if (ftpClient.login(ftpsUser, ftpsPass)){
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
System.out.println("Logged into FTP server successfully");
} else {
System.out.println("Failed log into FTP server");
ftpClient.logout();
ftpClient.disconnect();
return;
}
对于已编辑的问题
要找出上传失败的原因,您可以使用 getReplyString()
获得服务器的最后回复。例如:
boolean uploaded = ftpClient.storeFile("/wwwroot/preview/history.txt", inputStream);
if(!uploaded) {
System.err.println("Can't upload File! Reply from Server: " + ftpClient.getReplyString());
} else {
System.out.println("Upload successful");
}
PS: FTPClient 很少显示错误或警告消息,因此最好添加一个PrintCommandListener
进行调试。
ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out), true));
我正在使用 org.apache.commons.net.ftp.FTPSClient 将文件上传到 FTPS 服务器(超过 TLS/SSL)。
注意FTP服务器位于Windows服务器上,证书是自签的,在我接受了警告后可以通过FileZilla连接成功上传文件证书无效。
但是 java 处理相同内容的代码不起作用。我在代码中分别检查了连接步骤和登录步骤,发现错误发生在连接步骤 (ftps.connect(server,port)) 之后 - 日志 "Connected to server:port" 已打印在控制台中。我很困惑应该在已经完成的连接步骤中处理 getRemoteAddress。
String ftpsServer = "host";
int ftpsPort = 21;
String ftpsUser = "domain\username";
String ftpsPass = "password";
try{
FTPSClient ftpClient = new FTPSClient();
ftpClient.connect(ftpsServer,ftpsPort);
// check FTP connection
int reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)){
ftpClient.disconnect();
System.err.println("FTP server refused connection.");
System.exit(1);
} else {
System.out.println("Connected to " + ftpsServer + ":" + ftpsPort + ".");
}
// check FTP login
if (ftpClient.login(ftpsUser, ftpsPass)){
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
System.out.println("Logged into FTP server successfully");
} else {
System.out.println("Failed log into FTP server");
ftpClient.logout();
ftpClient.disconnect();
}
File localFile = new File("C:/test/history.txt");
InputStream inputStream = new FileInputStream(localFile);
boolean uploaded = ftpClient.storeFile("/wwwroot/preview/history.txt", inputStream);
System.out.println("uploaded successful? " + uploaded);
inputStream.close();
ftpClient.logout();
ftpClient.disconnect();
}catch(Exception e){
LOG.error("Exception when merging Reminderlist is: ", e);
}
控制台打印的完整日志是:
Connected to 10.20.254.xx:21.
Failed log into FTP server
ERROR 2017-10-13 15:27:15,322 [main]
com.redwood.contentmanagement.UnzipFiles: Exception when merging
Reminderlist is:
java.lang.NullPointerException
at
org.apache.commons.net.SocketClient.getRemoteAddress(SocketClient.java:553) ~[commons-net-2.2.jar:2.2]
at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:509) ~[commons-net-2.2.jar:2.2]
at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:425) ~[commons-net-2.2.jar:2.2]
at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:1548) ~[commons-net-2.2.jar:2.2]
at com.redwood.contentmanagement.TransferOverFTPS.myTransform(TransferOverFTPS.java:55) ~[classes/:?]
at com.redwood.contentmanagement.TransferOverFTPS.main(TransferOverFTPS.java:110) ~[classes/:?]
非常感谢@devpuh的回复,我在用户名中将\改为/后登录成功,但是上传文件还是失败,也没有详细说明失败的地方,下面是完整的登录控制台:
Connected to 10.20.254.10:21.
Logged into FTP server successfully
uploaded successful? false
对于原题
您的登录凭据不正确,但您仍在尝试上传文件。
您必须妥善处理错误登录。例如:
// check FTP login
if (ftpClient.login(ftpsUser, ftpsPass)){
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
System.out.println("Logged into FTP server successfully");
} else {
System.out.println("Failed log into FTP server");
ftpClient.logout();
ftpClient.disconnect();
return;
}
对于已编辑的问题
要找出上传失败的原因,您可以使用 getReplyString()
获得服务器的最后回复。例如:
boolean uploaded = ftpClient.storeFile("/wwwroot/preview/history.txt", inputStream);
if(!uploaded) {
System.err.println("Can't upload File! Reply from Server: " + ftpClient.getReplyString());
} else {
System.out.println("Upload successful");
}
PS: FTPClient 很少显示错误或警告消息,因此最好添加一个PrintCommandListener
进行调试。
ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out), true));