2013-11-13 3 views
0

Я использую com.enterprisedt.net.ftp jar для FTP-файлов в удаленном месте. Мой код выглядитфайл становится поврежденным во время FTP

try{ 
        ftp.mkdir(actDirToSearch);  
       }catch(Exception e){ 
        Log.addInLog(Log.ERR,e.getMessage()); 
       }   
       ftp.chdir(actDirToSearch); 
       try{ 
       ftp.put(tarStream, fileName); 
       } 
       catch(Exception ex){ 
        throw new FTPException(ex.getMessage()); 
       } 

      }catch(FTPException e){ 
        throw e; 

      }catch(IOException e){ 
       throw e; 

      }finally{ 
       try { 
        if(ftp != null){ 
         ftp.quit(); 
        } 
       } 

Также я использую этот код, чтобы загрузить файл tar.gz в 2-х различных удаленной машины с RHEL 5.4 и 6. Но когда-нибудь я получаю сообщение об успешном, когда-то tar.gz файл становится коррумпированной после загрузка с меньшим размером на удаленном компьютере. Во время отладки я нашел поведение, которое, если я остановлюсь на строке if (ftp! = Null), а затем через некоторое время я запустим ftp.quit(), он всегда будет успешным. Я видел через ftp-код, я не нашел отдельного потока для ftp-файла tar.gz. Все это происходит последовательно. Мое сомнение в том, почему этот tar.gz-файл поврежден, и почему я получаю успех во время отладки?

Услуги vsftpd работают на обоих устройствах. Также при выполнении ftp вручную с терминала его получение преуспело. Версия Java - 1,6.

+0

Я не знаком с этой FTP-библиотекой, поэтому может помочь увидеть JavaDoc, но я бы рискнул предположить, что вам, вероятно, придется закрыть и/или очистить FTP-соединение до того, как просто уйти. – CodeChimp

+0

Мы переносим в двоичном формате – Krishna

+0

Форматирование передачи не имеет ничего общего с закрытием и/или промывкой выходного потока. Если вы откроете BufferedOutputStream, начните записывать биты так быстро, как сможете, а затем прекратите приложение, очень возможно, что программа не закончит запись битов до того, как приложение опустится. Как правило, в IO вы открываете соединение, обмениваете биты (возможно, несколько раз нажимаете), закрываете соединение, затем завершаете. Мое замечание состояло в том, что я вижу заявление о выходе, но я не вижу закрытия флеша. Я не знаком с API, но я ожидал бы закрыть соединение, когда это будет сделано. – CodeChimp

ответ

1

Проверьте настройки FTP - большинство реализаций FTP имеют настройки для типа файла; если он является текстовым, двоичным, или предполагается, что реализация должна определить для себя, какой тип он есть.


в ответ на комментарий:

Я не знаком с протоколом FTP в деталях, но я знаю, что клиенты FTP обычно имеют настройку «текст» или «бинарные» файлы, и чтобы клиент определял, какой тип файла передается, просматривая первые байты в нем. Я ожидаю, что это то, что передается клиентом на сервер, так что сервер может делать такие вещи, как перевод конечной строки в набор байтов, который подходит для конкретной ОС сервера.

Полагаю, вы не устанавливаете это, поскольку вы, кажется, не знаете об этом, и это может вызвать эти симптомы. Прочтите свою библиотечную документацию и найдите ее. Вы ссылаетесь на объект «ftp», смотрите документацию (или источник) для этой библиотеки и выясняете, нет ли способа установить параметр для текста или двоичного кода.

Вы также можете использовать шестнадцатеричный редактор, чтобы посмотреть на байты в источнике и в файлах результатов, чтобы увидеть, можно ли увидеть шаблон в коррупции - все байты выглядят правильно, пока они не доберутся до места, где у источника был символ конца строки, но на самом деле это двоичный файл? Развертывает ли сервер 8-й бит (в конце концов, FTP возвращается к временам обычно используемого 7-битного ASCII).

+0

Привет, на самом деле я пытаюсь загрузить tar-файл с помощью InputStream stream = new FileInputStream (toUpload); как поток к ftp.put. Я хочу, чтобы тот же файл tar на удаленном компьютере, как есть. Не получается, почему он становится коррумпированным. – Krishna

Смежные вопросы