2012-02-29 9 views
6

Quando si scarica il file con il seguente codice, basta scrivere il file sulla destinazione in locale ma le dimensioni del file sono tutte zero. Qualcuno può dire Perché questo accada e come risolverlo?ftp non scarica correttamente il file in 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

Che cosa ha a che fare con la libreria Java Swing? Perché il tag Swing? –

+0

La gestione del flusso è un incubo, si chiude solo l'ultimo FileOutputStream. – home

risposta

15

dopo la ricerca nella documentazione Apache vengo a conclusione che BINARY_FILE_TYPE non è ancora risolta. Ho aggiunto il seguente codice e tutto è OK. grazie a tutti voi che avete aiutato

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

Questo è di grande aiuto. Questo risolve il problema del file scaricato, "il file archiviato è incompleto". Grazie mille! – Richard

+0

Corretti alcuni file gzip (.gz) corrotti che ricevevo da una richiesta FTP, grazie. – Ina

+0

A proposito, l'ultima riga deve essere: ** client.setFileType (FTPClient.BINARY_FILE_TYPE); ** –

1

provare a chiudere il flusso ad ogni iterazione nel ciclo

fos.close(); 

Il codice non sta facendo correttamente perché avete un ciclo for che crea nuovo flusso di ogni iterazione, ma solo chiude l'ultimo

+0

dopo il download quando apro il file ricevo il seguente errore: Errore: errore di lettura del file zip non recuperabile. ' – itro

4

stai usando la variabile percorso locale per puntare al file remoto:

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

si vuole puntare al file remoto, non è la destinazione locale, in questo modo:

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

Inoltre, assicurarsi che si chiude il flusso di fos dopo aver letto ogni file, piuttosto che proprio alla fine. È possibile utilizzare IOUtils.closeQuietly(fos); per questo se si ottiene la libreria commons.io, che evita i blocchi try-catch nidificati.

Si dovrebbe anche usare binario di tipo di file e BLOCK modalità di trasferimento per il trasferimento di file zip:

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

dopo il download quando apro il file viene visualizzato l'errore seguente: ** Errore: errore di lettura del file zip non recuperabile. ** questo accada solo con file zip.quando ho scaricato il file .csv è ok. – itro

+0

Sembra un problema completamente diverso. Puoi scaricare e aprire manualmente il file zip? Sembra che il file config.zip sul server sia corrotto. – seanhodges

+0

Guardando la pagina sembra che tu mi abbia battuto su questo @itro, ma ho comunque aggiornato la mia risposta per completezza. – seanhodges