Domanda

Ho un'applicazione java su Websphere che utilizza Apache Commons FTPClient per recuperare i file da un server Windows tramite FTP. Quando ho distribuire l'applicazione di Websphere in esecuzione in un ambiente Windows, sono in grado di recuperare tutti i file in modo pulito. Tuttavia, quando schiero la stessa applicazione per Webpshere su Linux, ci sono casi in cui sto ottenendo un file incompleti o corrotti. Questi casi sono coerenti, però, in modo tale che gli stessi file fallirà ogni tempo e restituire lo stesso numero di byte (di solito solo pochi byte meno di quello che dovrei ottenere). Direi che posso leggere circa il 95% dei file con successo su Linux.

Ecco il codice in questione ...

ftpc = new FTPClient();
// set the timeout to 30 seconds
    ftpc.enterLocalPassiveMode();
    ftpc.setDefaultTimeout(30000);
    ftpc.setDataTimeout(30000); 
    try
    {
              String ftpServer = CoreApplication.getProperty("ftp.server");
        String ftpUserID = CoreApplication.getProperty("ftp.userid");
        String ftpPassword = CoreApplication.getProperty("ftp.password");

        log.debug("attempting to connect to ftp server = "+ftpServer);
        log.debug("credentials = "+ftpUserID+"/"+ftpPassword);

        ftpc.connect(ftpServer);

        boolean login = ftpc.login(ftpUserID, ftpPassword);

        if (login) 
        {
            log.debug("Login success...");          } 
        else 
        {
            log.error("Login failed - connecting to FTP server = "+ftpServer+", with credentials "+ftpUserID+"/"+ftpPassword);
            throw new Exception("Login failed - connecting to FTP server = "+ftpServer+", with credentials "+ftpUserID+"/"+ftpPassword);
        }

        is = ftpc.retrieveFileStream(fileName);
          ByteArrayOutputStream out = null; 
          try { 

              out = new ByteArrayOutputStream(); 
              IOUtils.copy(is, out); 
          } finally { 
              IOUtils.closeQuietly(is); 
              IOUtils.closeQuietly(out); 
          }

          byte[] bytes = out.toByteArray();
          log.info("got bytes from input stream - byte[] size is "+ bytes.length);

Qualsiasi aiuto con questo sarebbe molto apprezzato.

Grazie.

È stato utile?

Soluzione

Ho il sospetto che il FTP potrebbe essere utilizzando ASCII piuttosto che modalità di trasferimento binario, e la mappatura quello che pensa siano finestra sequenze di fine linea nei file di Unix end-of-linee. Per i file che sono in realtà il testo, questo funzionerà. Per i file che sono veramente binario, il risultato sarà la corruzione e un file leggermente più corto se il file contiene alcune sequenze di byte.

FTPClient.setFileType(...) .

FOLLOWUP

  

... e allora perché questo dovrebbe funzionare su Windows e non Linux rimane un mistero per un altro giorno.

Il mistero è facile da spiegare. Stavi FTP'ing file da un computer Windows a un computer Windows, quindi non c'era bisogno di cambiare i marcatori di fine linea.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top