2011-11-16 20 views
13

Si prega di capire questo. Il codice funziona correttamente senza eccezioni.FtpClient storeFile restituisce sempre False

 FTPClient ftp = new FTPClient(); 
     ftp.connect(server); 
     if(!ftp.login(username, password)) 
     { 
      ftp.logout(); 
      return false; 
     } 
     int reply = ftp.getReplyCode(); 
     if (!FTPReply.isPositiveCompletion(reply)) 
     { 
      ftp.disconnect(); 
      return false; 
     } 
     InputStream in = new FileInputStream(localfile); 
     ftp.setFileType(ftp.BINARY_FILE_TYPE, ftp.BINARY_FILE_TYPE); 
     ftp.setFileTransferMode(ftp.BINARY_FILE_TYPE); 
     Store = ftp.storeFile(destinationfile, in); 
     in.close(); 
     ftp.logout(); 
     ftp.disconnect(); 
    } 
    catch (Exception ex) 
    { 
     ex.printStackTrace(); 
     return false; 
    } 
    return Store; 

Buttttttttt

istruzione return restituisce sempre false e il file non viene caricato sul server. Qualcuno per favore aiutaci su questo.

Per vostra informazione, 1) sono in una rete di uffici. ---> dobbiamo aggiungere qualche proxy?


  File file = new File("C:\\Users\\sg0214273\\Desktop\\seagate\\seagate.txt"); 
      FileInputStream input = new FileInputStream(file); 
      client.setFileType(FTP.BINARY_FILE_TYPE); 
      if (!client.storeFile(file.getName(), input)) { 
      System.out.println("upload failed!"); 
      } 
      reply = client.getReplyCode(); 

      if(!FTPReply.isPositiveCompletion(reply)) { 
       System.out.println("upload failed!"); 
      } 



     Login success... 
     230 User ******** logged in. 
     upload failed!-----> is form boolean return value of storefile 
     upload failed!---------> is from replycode... 
     Logout from FTP server... 

Si prega di dare una mano

+0

Cosa restituisce ftp.getReplyCode()? Dopo il file ftp.store? –

+0

@Gray n.Guarda la prima frase –

risposta

17

Il messaggio esatto fallimento si possono trovare chiamando FtpClient#getReplyCode(). Da quella pagina (il corsivo è mio):

Subito dopo il collegamento è l'unica in tempo reale è necessario controllare il codice di risposta (perché di connessione è di tipo void). La convenzione per tutti i metodi di comando FTP in FTPClient è tale che o restituiscono un valore booleano o qualche altro valore. I metodi booleani restituiscono true su una risposta di completamento corretta dal server FTP e false su una risposta che genera una condizione di errore o un errore. I metodi restituiscono un valore diverso da booleano restituiscono un valore contenente i dati di livello superiore prodotto dal comando FTP o null se una risposta ha provocato una condizione di errore o un errore. Se si desidera accedere al codice di risposta FTP esatto provocando un esito positivo o negativo, è necessario chiamare getReplyCode dopo un esito positivo o negativo.

cosa significa quello che un codice di ritorno, si può vedere Wikipedia: List of FTP server return codes.

+0

Grazie per la risposta immedialty. I problemi persistono. File file = nuovo file ("C: \\ Utenti \\ sg0214273 \\ Desktop \\ seagate \\ seagate.txt"); \t Input FileInputStream = nuovo FileInputStream (file); \t client.setFileType (FTP.BINARY_FILE_TYPE); \t if (! Client.storeFile (file.getName(), input)) { \t System.out.println ("upload failed!"); \t} \t reply = client.getReplyCode(); \t \t se (FTPReply.isPositiveCompletion (risposta)!) { \t \t \t System.out.println ("Caricamento fallito!"); \t \t} l'output è upload fallito! upload fallito! – RaviKiran

+1

Sì, ma qual è il * valore * di getReplyCode. Questo è il codice di risposta FTP: vedi http://en.wikipedia.org/wiki/List_of_FTP_server_return_codes –

+0

il valore di getReplyCode è 230 dopo il login e 550 dopo il file di archivio ... (immediatamente successivo) – RaviKiran

5

L'argomento è piuttosto vecchio ma forse lo aiuterò a qualsiasi altro. Ho confrontato ciò che FileZilla invia al server FTP e il mio programma ha fatto. Avevo bisogno di usare ftp.enterLocalPassiveMode() per farlo funzionare, ftp.pasv() non va bene :)

E per il debug è meglio usare getReplyString() che solo getReplyCode()

2

Modificare il codice per voi passare alla modalità passiva prima di trasferire il file con storeFile() come segue:

... 
ftp.setFileTransferMode(ftp.BINARY_FILE_TYPE); 
ftp.enterLocalPassiveMode();//Switch to passive mode 
Store = ftp.storeFile(destinationfile, in); 
in.close(); 
... 

Speranza che aiuta.

+0

Ho appena avuto un problema usando Apache commons FTP come il client che si connette da una macchina di sviluppo Windows 7 a un server Windows 7 ftp di test su IIS 7.5. Il file ftp.store ha restituito un ReplyCode di 501 (che afferma di essere un errore di sintassi). La correzione era di impostare la modalità passiva per server e client utilizzando ftp.enterRemotePassiveMode(); ftp.enterLocalPassiveMode(); – MartinS

1

si prega di aggiungere la libreria apache per questo codice questo sono la classe impoted

import org.apache.commons.net.ftp.FTP; 
import org.apache.commons.net.ftp.FTPClient; 
import org.apache.commons.net.ftp.FTPFile; 
import org.apache.commons.net.ftp.FTPReply; 

classe resto di importazione è di java.io o java.net

public boolean upload(String server,String username,String password,File localfile){ 
     boolean Store=false; 
     try{ 
     FTPClient ftp = new FTPClient(); 
       // ftp.connect(server); 
    /* you can use either code which is written above above or below code as ftp port 20 is used for the data transfer and port 21 is used for command and controlls */ 
      ftp.connect(InetAddress.getByName(server),21); 
    //here 'server' is your domain name of ftp server or url 
       if(!ftp.login(username, password)) 
       { 
        ftp.logout(); 
        return false; 
       } 
      ftp.sendNoOp();//used so server timeout exception will not rise 
       int reply = ftp.getReplyCode(); 
       if (!FTPReply.isPositiveCompletion(reply)) 
       { 
        ftp.disconnect(); 
        return false; 
       } 
       ftp.enterLocalPassiveMode(); /* just include this line here and your code will work fine */ 
       InputStream in = new FileInputStream(localfile); 
       // ftp.setFileType(ftp.BINARY_FILE_TYPE, ftp.BINARY_FILE_TYPE); 
       ftp.setFileType(FTP.BINARY_FILE_TYPE); 
       // ftp.setFileTransferMode(ftp.BINARY_FILE_TYPE); 
       Store = ftp.storeFile(destinationfile, in); 
       in.close(); 
      //ftp.disconnect(); 
    //here logout will close the connection for you 
       ftp.logout(); 

      } 
      catch (Exception ex) 
      { 
       ex.printStackTrace(); 
       return false; 
      } 
     return Store; 
    } 
+0

Grazie Naval. ftp.enterLocalPassiveMode(); è davvero utile per me. – yaryan997

0

tenta di utilizzare ftp.enterLocalPassiveMode(); prima di ftp.storeFile (destinationfile, in);