2013-08-03 2 views
0

Я использую FTP-клиент Apache Commons для извлечения файлов с FTP-сервера. Это установка:Apache Commons FTPClient не удается получить некоторые файлы

ftpClient.setDefaultPort(port); 
      ftpClient.connect(server); 
      ftpClient.login(user, password); 
      ftpClient.enterLocalPassiveMode(); 
      ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); 
      ftpClient.changeWorkingDirectory(path); 

Это код передачи:

final FileOutputStream fileOutputStream = new FileOutputStream(tempFile); 
        final boolean result = ftpClient.retrieveFile(dirToList + aFile.getName(), fileOutputStream); 
        Log.i(TAG, "[" + (result ? "+" : "-") + "]"); 

И что я вижу в журналах:

I/SyncService(4412): /Users/user1/Downloads/FtpSync/.idea/copyrightprofiles_settings.xml 
I/SyncService(4412): [-] 
<...> 
I/SyncService(4412): /Users/user1/Downloads/FtpSync/footer.php 
I/SyncService(4412): [+] 

Все PHP файлы синхронизируются, и все XML-файлы не удалось синхронизировать. FTP-сервер находится на моем локальном ноутбуке (Mac OS X по умолчанию FTP-сервер, tnftpd 20100324 + GSSAPI)

Почему это не работает?

ответ

1

Во-первых, вы всегда должны закрывать выходной поток после метода retrieveFile. Вы пытались изменить FTP. {Filetype} при загрузке XML-файлов (хотя это не должно быть так)?

+0

Изменен для ASCII, это не помогло. – arts777

+0

Ваш код не кажется неправильным. Моя следующая идея пойдет на пользовательские привилегии. Вы уверены, что ваша учетная запись пользователя ftp имеет необходимые права на доступ к XML? И вы попробовали проверить ответ сервера на ваш запрос на загрузку? – awb

+0

Я подключаюсь к учетной записи rankor777,/Пользователи/rankor777 являются домом для этого пользователя. Я попытаюсь проверить его вручную с помощью команды ftp. – arts777

0

этот код для скачивания.

public boolean ftpDownload(String srcFilePath, String desFilePath) 
    { 
     boolean status = false; 
     try { 
      FileOutputStream desFileStream = new FileOutputStream(desFilePath);; //desfilepath where the file is to be stored 
      status = mFTPClient.retrieveFile(srcFilePath, desFileStream); 

      desFileStream.close(); 

      return status; 
     } catch (Exception e) { 
      Log.d(TAG, "download failed"); 
     } 

     return status; 
    } 
+0

Какое отношение это имеет к моему вопросу? – arts777

+0

ok используйте новый код для извлечения файлов. – Prakhar

+0

Этот код тот же, что я использовал. – arts777

1

У меня были проблемы с загрузкой некоторых больших файлов с помощью метода retrieveFile, где бы крах без выбрасывания исключения. В конце я использовал метод retrieveFileStream, который решил его для меня.

Заменить

status = mFTPClient.retrieveFile(srcFilePath, desFileStream); 

С

// import org.apache.commons.io.IOUtils; 

InputStream inputStream = mFTPClient.retrieveFileStream(srcFilePath); 
IOUtils.copy(inputStream, desFileStream); 
outputStream.flush(); 
IOUtils.closeQuietly(desFileStream); 
IOUtils.closeQuietly(inputStream); 

//status = mFTPClient.completePendingCommand(); 
status = true; 

completePendingCommand разбился, не бросать исключение для меня, следовательно, почему это комментируется, но я думаю, что это, как предполагается, будет называться после завершения команды.

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