Apache FTPClient - неполный поиск файлов в Linux, работает в Windows - PullRequest
2 голосов
/ 07 ноября 2010

У меня есть Java-приложение на Websphere, которое использует Apache Commons FTPClient для получения файлов с сервера Windows через FTP.Когда я развертываю приложение в Websphere, работающем в среде Windows, я могу без проблем извлечь все файлы.Однако, когда я развертываю то же самое приложение в Webpshere под Linux, бывают случаи, когда я получаю неполные или поврежденные файлы.Однако эти случаи согласуются, так что каждый раз одни и те же файлы будут давать сбой и возвращать одинаковое количество байтов (обычно всего на несколько байтов меньше, чем то, что я должен получить).Я бы сказал, что могу успешно прочитать примерно 95% файлов в Linux.

Вот соответствующий код ...

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

Любая помощь с этим будет принята с благодарностью.

Спасибо.

1 Ответ

2 голосов
/ 07 ноября 2010

У меня есть подозрение, что FTP может использовать ASCII, а не двоичный режим передачи, и отображать то, что он считает последовательностями конца окна в файлах, в конец строки Unix.Для файлов, которые действительно текстовые, это будет работать.Для файлов, которые действительно являются двоичными, результатом будет повреждение и немного более короткий файл, если файл содержит определенные последовательности байтов.

См. FTPClient.setFileType(...).

FOLLOWUP

... так почему это работает на Windows, а не на Linux, остается загадкой для другого дня.

Загадка легко объяснима,Вы передавали файлы по FTP с компьютера под управлением Windows на компьютер под управлением Windows, поэтому не нужно было менять маркеры конца строки.

...