apache commons net ftp sendCommand returns 错误的回复代码
apache commons net ftp sendCommand returns wrong reply code
我有一个 FTP 服务器,我正在尝试上传文件
在FTPClient.openDataConnection()中,我开始执行
if (!FTPReply.isPositivePreliminary(sendCommand(command, arg))) {
return null;
}
命令是"STOR",arg是"edf0864d-1651-43b2-8453-d160bf9d0742"(我要存储的文件名)
服务器日志如下所示:
PORT 86,185,26,230,213,101
200 Port command successful
STOR edf0864d-1651-43b2-8453-d160bf9d0742
150 Opening data channel for file upload to server of "/edf0864d-1651-43b2-8453-d160bf9d0742"
(Up to here after calling sendCommand)
PORT 86,185,26,230,213,102
200 Port command successful
从日志中响应代码是 150,但是 sendCommand returns 响应代码是 200
其他可能重要的信息
我正在使用 filezilla 服务器
服务器大部分时间都在工作,代码完全相同。文件的初始上传工作正常,然后当我选择另一个文件覆盖第一次上传时,出现这种情况。
在此之后,还有另一个同名文件,但我之前没有遇到过问题。
据我所知,服务器配置为被动连接,当我启动它时它不会像以前那样对我大喊大叫,但 PASV 命令会产生 421 无法创建套接字错误。我正在使用 ACTIVE_LOCAL 模式
我正在使用 apache commons net 3.6
如果有更多信息可以帮助,请告诉我
这是java的相关部分:
FTPClient ftp = new FTPClient();
String server = <server ip>;
int port = 21;
String username = <username>;
String password = <password>;
try{
ftp.connect(server, port);
}
catch(SocketException e){
throw new FTPCouldNotConnectException("Threw SocketException during connection", e);
}
catch(IOException e){
throw new FTPCouldNotConnectException("Threw IOException during connection", e);
}
int reply = ftp.getReplyCode();
if(!FTPReply.isPositiveCompletion(reply)){
try{
ftp.disconnect();
throw new FTPCouldNotConnectException("Reply Code: " + reply + ", Could not connect");
}
catch(IOException e){
throw new FTPCouldNotConnectException(
"Threw IOException during disconnection after failing to connect with reply code: " + reply,
e);
}
}
else{
try{
if(ftp.login(username, password)){
LOGGER.info("Successfully logged in to ftp server");
ftp.setFileTransferMode(org.apache.commons.net.ftp.FTP.STREAM_TRANSFER_MODE);
ftp.setFileStructure(org.apache.commons.net.ftp.FTP.FILE_STRUCTURE);
ftp.setFileType(org.apache.commons.net.ftp.FTP.BINARY_FILE_TYPE);
ftp.enterLocalActiveMode();
}
else{
LOGGER.warn("Failed to log in to ftp server");
}
}
catch(IOException e){
throw new FTPCouldNotConnectException("Failed to log in to server, threw ioexception", e);
}
}
try{
ftp.storeFile("edf0864d-1651-43b2-8453-d160bf9d0742", new FileInputStream("test.jpg"));
}
catch(IOException e){
LOGGER.error("java.io.IOException caught", e);
}
我找到了答案,因为代码的第一次调用工作正常,但第二次失败了。
在 java 代码中,我没有调用 FTPClient.completePendingCommand(),The docs say,导致后续调用出现意外行为。
我有一个 FTP 服务器,我正在尝试上传文件
在FTPClient.openDataConnection()中,我开始执行
if (!FTPReply.isPositivePreliminary(sendCommand(command, arg))) {
return null;
}
命令是"STOR",arg是"edf0864d-1651-43b2-8453-d160bf9d0742"(我要存储的文件名)
服务器日志如下所示:
PORT 86,185,26,230,213,101
200 Port command successful
STOR edf0864d-1651-43b2-8453-d160bf9d0742
150 Opening data channel for file upload to server of "/edf0864d-1651-43b2-8453-d160bf9d0742"
(Up to here after calling sendCommand)
PORT 86,185,26,230,213,102
200 Port command successful
从日志中响应代码是 150,但是 sendCommand returns 响应代码是 200
其他可能重要的信息
我正在使用 filezilla 服务器
服务器大部分时间都在工作,代码完全相同。文件的初始上传工作正常,然后当我选择另一个文件覆盖第一次上传时,出现这种情况。
在此之后,还有另一个同名文件,但我之前没有遇到过问题。
据我所知,服务器配置为被动连接,当我启动它时它不会像以前那样对我大喊大叫,但 PASV 命令会产生 421 无法创建套接字错误。我正在使用 ACTIVE_LOCAL 模式
我正在使用 apache commons net 3.6
如果有更多信息可以帮助,请告诉我
这是java的相关部分:
FTPClient ftp = new FTPClient();
String server = <server ip>;
int port = 21;
String username = <username>;
String password = <password>;
try{
ftp.connect(server, port);
}
catch(SocketException e){
throw new FTPCouldNotConnectException("Threw SocketException during connection", e);
}
catch(IOException e){
throw new FTPCouldNotConnectException("Threw IOException during connection", e);
}
int reply = ftp.getReplyCode();
if(!FTPReply.isPositiveCompletion(reply)){
try{
ftp.disconnect();
throw new FTPCouldNotConnectException("Reply Code: " + reply + ", Could not connect");
}
catch(IOException e){
throw new FTPCouldNotConnectException(
"Threw IOException during disconnection after failing to connect with reply code: " + reply,
e);
}
}
else{
try{
if(ftp.login(username, password)){
LOGGER.info("Successfully logged in to ftp server");
ftp.setFileTransferMode(org.apache.commons.net.ftp.FTP.STREAM_TRANSFER_MODE);
ftp.setFileStructure(org.apache.commons.net.ftp.FTP.FILE_STRUCTURE);
ftp.setFileType(org.apache.commons.net.ftp.FTP.BINARY_FILE_TYPE);
ftp.enterLocalActiveMode();
}
else{
LOGGER.warn("Failed to log in to ftp server");
}
}
catch(IOException e){
throw new FTPCouldNotConnectException("Failed to log in to server, threw ioexception", e);
}
}
try{
ftp.storeFile("edf0864d-1651-43b2-8453-d160bf9d0742", new FileInputStream("test.jpg"));
}
catch(IOException e){
LOGGER.error("java.io.IOException caught", e);
}
我找到了答案,因为代码的第一次调用工作正常,但第二次失败了。
在 java 代码中,我没有调用 FTPClient.completePendingCommand(),The docs say,导致后续调用出现意外行为。