Java: проблема с загрузкой файла на FTP (потеря пакетов) - PullRequest
2 голосов
/ 19 января 2011

Я пытаюсь перенести файл из приложения Java на FTP-сервер программа работает, файл передается, но когда я иду, чтобы открыть в папке FTO, файл поврежден, я думаю, что пакеты теряются во время передачи файла. Зачем? И как я могу это исправить?

Другой вопрос, как я могу остановить while, если я хочу остановить загрузку файла?

Спасибо всем!

Код внутри моего класса:

FTPClient client = new FTPClient();
InputStream is = null;
//...
try{
 client.connect(MY_FTP_URL);
 client.login(USER, PASS);
 InputStream is = new FileInputStream(file_path);
 OutputStream os = client.storeFileStream(file_name);
 byte[] buffer = new byte[1024];
 int len;
 //I use this way to check the transfer progress
 while((len = is.read(buffer)) != -1){
  os.write(buffer, 0, len);
  os.flush();
 }
 os.close();
} catch (IOException e){
 e.printStackTrace();
} finally{
 try{
  if(is != null){
   is.close();
  }
  client.disconnect();
 } catch(IOException e){
  e.printStackTrace();
 }
}

Ответы [ 2 ]

7 голосов
/ 19 января 2011

Ознакомьтесь с FAQ :

Q: Почему мои файлы повреждены после передачи?

A: Наиболее частая причина этого -Файл передается как ASCII, но содержимое файла не является ASCII, и файл должен быть передан как BINARY.RFC 959 говорит, что режим передачи по умолчанию должен быть ASCII.FTPClient соответствует стандарту.Вы должны явно вызвать setFileType (FTP.BINARY_FILE_TYPE);запросить режим двоичной передачи после входа на FTP-сервер.

Вызов setFileType(FTP.BINARY_FILE_TYPE);

2 голосов
/ 19 января 2011

FTP имеет два режима ASCII (обычно по умолчанию) и двоичный. Если вы передаете что-либо, кроме текста, вы должны перевести клиента в двоичный режим.

Как установить режим зависит от реализации клиента FTP, но для Commons IO см. http://commons.apache.org/net/api/org/apache/commons/net/ftp/FTPClient.html#setFileType(int)

...