2012-02-29 52 views
6

Cuando descargo el archivo con el siguiente código, simplemente escribo el archivo en el destino local pero el tamaño del archivo es cero. ¿Alguien puede decir por qué sucede esto y cómo solucionarlo?ftp no descarga el archivo correctamente en java?

import org.apache.commons.net.ftp.FTPClient; 
import org.apache.commons.net.ftp.FTPFile; 
import java.io.FileOutputStream; 
import java.io.IOException; 

public class FtpDownload { 
public static void main(String[] args) { 
    FTPClient client = new FTPClient(); 
    FileOutputStream fos = null; 
    String filename = "config.zip"; 
    try { 
     client.connect("ftpsrv"); 
     client.login("user", "user"); 

     for (FTPFile file : client.listFiles()) { 
      filename = "C:\\tmp\\user\\" + file.getName(); 
      if (file.isFile()) { 
       fos = new FileOutputStream(filename); 
       client.retrieveFile(filename, fos); 
       System.out.println(file.getName()); 
      } else if (file.isDirectory()) { 
       System.out.println("directory: " + file.getName()); 
      } 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (fos != null) { 
       fos.close(); 
      } 
      client.disconnect(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 
} 
+0

¿Qué tiene esto que ver con la biblioteca Java Swing? ¿Por qué la etiqueta Swing? –

+0

El manejo de su secuencia es una pesadilla, solo cierra el último FileOutputStream. – home

Respuesta

15

después de buscar en la documentación de Apache que venga a la conclusión de que BINARY_FILE_TYPE aún no está resuelto. he agregado el siguiente código y todo está bien. gracias a todos ustedes que ayudaron.

try { 
    client.connect(ftpServer); 
    client.login(username, password); 
    // following line fixed my zip file corruption issue. 
    client.setFileType(FTP.BINARY_FILE_TYPE); 
+0

Esto es de gran ayuda. Esto soluciona el problema del archivo descargado, "el archivo archivado está incompleto". Muchas gracias! – Richard

+0

Esto corrigió algunos archivos corruptos gzipped (.gz) que obtenía de una solicitud FTP, gracias. – Ina

+0

Por cierto, la última línea debería ser: ** client.setFileType (FTPClient.BINARY_FILE_TYPE); ** –

1

intente cerrar la corriente en cada iteración del bucle

fos.close(); 

El código no lo está haciendo correctamente porque tiene un bucle que crea nueva fuente de cada iteración, pero sólo cierra la última

+0

después de la descarga cuando abro el archivo recibo el siguiente error: Error: error de lectura del archivo zip irrecuperable. – itro

4

Usted está utilizando la variable de ruta local para que apunte al archivo remoto:

filename = "C:\\tmp\\user\\" + file.getName(); 
... 
client.retrieveFile(filename, fos); 

Usted quiere apuntar al archivo remoto, no el destino local, así:

client.retrieveFile(file.getName(), fos); 

También, asegúrese de cerrar el flujo de fos después de leer cada archivo, en lugar de la derecha al final. Puede usar IOUtils.closeQuietly(fos); para esto si obtiene la biblioteca commons.io, que evita los bloques try-catch anidados.

También debe utilizar binario tipo archivo y modo de transferencia BLOQUE para la transferencia de archivos zip:

client.setFileTransferMode(FTPClient.BLOCK_TRANSFER_MODE); 
client.setFileType(FTPClient.BINARY_FILE_TYPE); 
+0

después de la descarga cuando abro el archivo obtengo el siguiente error: ** Error: error de lectura del archivo zip irrecuperable. ** esto sucede solo con archivo zip. Cuando descargo el archivo .csv está bien. – itro

+0

Eso suena como un problema diferente por completo. ¿Puedes descargar y abrir el archivo zip manualmente? Parece que el archivo config.zip en el servidor está dañado. – seanhodges

+0

Mirando hacia abajo en la página, parece que me ganaste en este @itro, pero actualicé mi respuesta de todos modos para que esté completa. – seanhodges

Cuestiones relacionadas