Question

J'ai une application java sur Websphere qui utilise Apache Commons ClientFTP pour récupérer des fichiers à partir d'un serveur Windows via FTP. Quand je Déployez l'application de Websphere en cours d'exécution dans un environnement Windows, je suis en mesure de récupérer tous les fichiers proprement. Cependant, quand je déploie la même application à Webpshere sur Linux, il y a des cas où je reçois un des dossiers incomplets ou corrompus. Ces cas sont compatibles si, de sorte que les mêmes fichiers échouent à chaque fois et rendre le même nombre d'octets (habituellement seulement quelques octets de moins que ce que je devrais obtenir). Je dirais que je peux lire environ 95% des fichiers avec succès sur Linux.

Voici le code correspondant ...

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);

Toute aide à ce serait grandement apprécié.

Merci.

Était-ce utile?

La solution

Je soupçonne que le FTP pourrait être en utilisant ASCII plutôt que le mode de transfert binaire, et la cartographie ce qu'il pense sont des séquences de fenêtre en fin de ligne dans les fichiers à Unix de fin de lignes. Pour les fichiers qui sont vraiment texte, cela fonctionnera. Pour les fichiers qui sont vraiment binaires, le résultat sera la corruption et un fichier légèrement plus court si le fichier contient certaines séquences d'octets.

Voir FTPClient.setFileType(...) .

FOLLOWUP

  

... alors pourquoi cela fonctionnerait sous Windows et non Linux reste un mystère pour un autre jour.

Le mystère est facile à expliquer. Vous avez été FTP'ing fichiers à partir d'une machine Windows à une machine Windows, donc il n'y avait pas besoin de changer les marqueurs de fin de ligne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top