2017-03-08 5 views
2

J'ai un serveur FTP, j'essaye de télécharger un fichierapache commons net ftp sendCommand renvoie le mauvais code de réponse

dans FTPClient. openDataConnection(), je descends à la ligne

if (!FTPReply.isPositivePreliminary(sendCommand(command, arg))) { 
    return null; 
} 

La commande est "STOR" et arg est "edf0864d-1651-43b2-8453-d160bf9d0742" (le nom du fichier que je veux stocker)

le journal du serveur ressemble:

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 

à partir du journal le code de réponse est de 150, mais sendCommand renvoie un code de réponse de 200

O Ther des informations potentiellement importantes

J'utilise serveur filezilla

Le serveur fonctionne la plupart du temps, avec le même code. Le téléchargement initial du fichier fonctionne bien, puis lorsque je choisis un autre fichier pour écraser le premier téléchargement, cela arrive. Suite à cela, il y a un autre fichier avec le même nom, mais je n'ai jamais eu de problème avec ça auparavant.

Le serveur est configuré pour les connexions passives autant que je peux dire, il ne me crie pas quand je le lance comme avant, mais la commande PASV produit un 421 ne pouvait pas créer d'erreur de socket. J'utilise le mode ACTIVE_LOCAL

J'utilise apache net 3.6 communes

Laissez-moi savoir s'il y a plus d'informations qui peuvent aider

Ce sont les parties pertinentes de la 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); 
} 

Wireshark Packets (let me know if you need more)

+0

S'il vous plaît ajouter plus de code – Grzesiek

+0

S'il vous plaît ajouter exactement la bibliothèque à partir de laquelle vous utilisez et leurs versions. – Grzesiek

+0

Ajout du code Java et de la version de la bibliothèque –

Répondre

2

Je trouve la réponse basée sur le fait que le premier appel du code a bien fonctionné, mais le second a échoué.

Dans le code Java, je n'avais pas appelé FTPClient.completePendingCommand(), qui, en tant que The docs say, provoquait un comportement inattendu des appels suivants.