Android FTPClient - retrieveFileStream () всегда возвращает значение null

Я новичок в Android. Я пытаюсь загрузить файл с ftp-сервера на SD-карту с помощью Apache Commons FTPClient. Строка InputStream input = client.retrieveFileStream ("/" + fileName); всегда возвращает null. Но файл находится в папке FTP. Пожалуйста, помогите мне узнать, в чем ошибка.

В своем манифесте я установил следующие разрешения: android: name = "android.permission.INTERNET" и android: name = "android.permission.WRITE_EXTERNAL_STORAGE"

Мой код

private static void downLoad(){
    FTPClient client = new FTPClient();
    FileOutputStream fos = null;

    try {
        client.connect("ftp.doamin.com");
        client.login("8888", "8888");
String filePath = "/mnt/sdcard/download/CheckboxHTML.txt" ;
String fileName = "CheckboxHTML.txt";
fos = new FileOutputStream(filePath);
InputStream input = client.retrieveFileStream("/" + fileName);
byte[] data = new byte[1024];
int count  = input.read(data); 
while ((count = input.read(data)) != -1) {
      fos.write(data, 0, count);
}
fos.close();
      if(!client.completePendingCommand()) { 
      client.logout(); 
      client.disconnect(); 
      System.err.println("File transfer failed."); 
} 
    } catch (SocketException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
    }

}

Спасибо за ваше время и интерес. Анант.


person Ananth    schedule 24.11.2011    source источник
comment
Это может быть глупо, но вы неправильно написали адрес ftp-домена?   -  person Deepak    schedule 24.11.2011
comment
Нет, я правильно написал.   -  person Ananth    schedule 24.11.2011
comment
Вы можете проверить коды ошибок с помощью вызовов, упомянутых в этой ссылке, stackoverflow.com/questions/507660/   -  person Deepak    schedule 24.11.2011
comment
Я проверю, Дипак. Спасибо.   -  person Ananth    schedule 24.11.2011


Ответы (2)


НАСКОЛЬКО МНЕ ИЗВЕСТНО. Вы должны завершить передачу файлов, вызвав completePendingCommand () и убедившись, что передача действительно прошла успешно. т.е. вам нужно добавить вызов функции ниже fos.clos ().

fos.close();
client.completePendingCommand()

Вы также можете учитывать это, согласно API для FTPClient.retrieveFileStream (), метод возвращает null, когда не может открыть соединение для передачи данных, и в этом случае вы должны проверить код ответа (например, getReplyCode (), getReplyString (), getReplyStrings ( )), чтобы понять, почему это не удалось.

person M. Usman Khan    schedule 05.06.2013

Поработав над этой проблемой и потратив несколько часов, я обнаружил, что Android Apache retrieveFile() и retrieveFileStream иногда работает не очень хорошо, когда размер файла слишком велик.

Убедитесь, что для правильного TypeFile установлено значение BinaryFile.

mFTPClient.setFileType (FTP.BINARY_FILE_TYPE);

Также никогда не забывайте передавать LocalPassiveMode для команд загрузки.

mFTPClient.enterLocalPassiveMode ();

person VelocityPulse    schedule 04.03.2020