2011-11-16 94 views
13

Por favor descárguelo. El código se ejecuta correctamente sin excepción.FtpClient storeFile siempre devuelve 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

instrucción de retorno siempre return false y el archivo no se carga en el servidor. Alguien por favor ayuda en esto.

Para su información, 1) estoy en una red de oficinas. ---> ¿necesitamos agregar algún proxies?


  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... 

por favor ayuda a

+0

¿Qué devuelve ftp.getReplyCode()? Después de ftp.storeFile? –

+0

@Gray no.Mire la primera oración –

Respuesta

17

el fallo preciso se puede encontrar llamando FtpClient#getReplyCode(). Desde esa página (el subrayado es mío):

Inmediatamente después de la conexión es el único tiempo real, es necesario comprobar el código de respuesta (porque de conexión es de tipo void). La convención para todos los métodos de comando FTP en FTPClient es tal que devuelven un valor booleano u otro valor. Los métodos booleanos devuelven verdadero en una respuesta de finalización exitosa desde el servidor FTP y falso en una respuesta que da como resultado una condición de error o falla. Los métodos que devuelven un valor distinto de booleano devuelven un valor que contiene el datos de nivel superior producidos por el comando FTP, o nulo si una respuesta dio como resultado una condición de error o error. Si desea acceder al código de respuesta FTP de que causa un error o falla, debe llamar al getReplyCode después de un éxito o error.

para ver lo que significa un código de retorno, se puede ver Wikipedia: List of FTP server return codes.

+0

Gracias por la respuesta inmediata. El problema persiste Archivo = archivo nuevo ("C: \\ Users \\ sg0214273 \\ Desktop \\ seagate \\ seagate.txt"); \t FileInputStream input = new FileInputStream (archivo); \t client.setFileType (FTP.BINARY_FILE_TYPE); \t if (! Client.storeFile (file.getName(), input)) { \t System.out.println ("¡carga fallida!"); \t} \t reply = client.getReplyCode(); \t \t si (FTPReply.isPositiveCompletion (respuesta)) { \t \t \t System.out.println ("Error de subida"); \t \t} salida es upload failed! carga fallida – RaviKiran

+1

Sí, pero ¿cuál es el * valor * de getReplyCode. Este es el código de respuesta FTP: vea http://en.wikipedia.org/wiki/List_of_FTP_server_return_codes –

+0

el valor de getReplyCode es 230 después del inicio de sesión y 550 después del archivo de almacenamiento ... (inmediatamente después) – RaviKiran

5

El tema es bastante antiguo pero quizás ayude a cualquier otro. Comparé lo que FileZilla envía al servidor FTP y mi programa. Necesitaba usar ftp.enterLocalPassiveMode() para hacer que funcione, ftp.pasv() no es bueno :) código

Y para la depuración es mejor utilizar getReplyString() que sólo se getReplyCode()

2

Modificar le permite cambiar al modo pasivo antes de transferir el archivo con storeFile() de la siguiente manera:

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

Espero que ayude.

+0

Acabo de tener un problema al utilizar Apache commons FTP como el cliente que se conecta desde una máquina de desarrollo de Windows 7 a un servidor de Windows 7 ftp de prueba en IIS 7.5. El ftp.storefile devolvió un ReplyCode de 501 (que dice ser un error de sintaxis). La solución fue establecer el modo pasivo para el servidor y el cliente usando ftp.enterRemotePassiveMode(); ftp.enterLocalPassiveMode(); – MartinS

1

favor añadir la biblioteca Apache para este código esto son la clase 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; 

clase resto de importaciones de 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

Gracias Naval. ftp.enterLocalPassiveMode(); es realmente útil para mí – yaryan997

0

intenta utilizar ftp.enterLocalPassiveMode(); antes de ftp.storeFile (destinationfile, in);

Cuestiones relacionadas