Как сделать простой ftp файл на Android

Я нигде не могу найти пример простого FTP-доступа к файлу, а класс FTPClient (который используется в нескольких примерах) не отображается в индексе классов Android. У меня работает доступ по http, но как мне получить простой доступ по FTP? Все, что я хочу сделать, это загрузить (например): ftp: //tgftp.nws.noaa.gov/data/observations/metar/stations/KABQ.TXT Это не должно требовать входа в систему, изменения каталога и т. д. Простое указание этого URL-адреса для методов доступа http не кажется работать.

Это похоже на вопрос: невозможно прочитать файл с ftp в android ?

Я попробовал простой:

  StringBuilder response = new StringBuilder();
  URLConnection ftpConn;
  try {
  URL netUrl = new URL("ftp://tgftp.nws.noaa.gov/data/observations/metar/stations/KABQ.TXT");
  ftpConn = netUrl.openConnection();
  BufferedInputStream bufRd = new BufferedInputStream(ftpConn.getInputStream());
  int temp;
  while ((temp = bufRd.read()) != -1) {
      response.append(temp);
  }
  bufRd.close();
  } catch (Exception e) {
      return "Failure";
  }

но он получает исключение для getInputStream: невозможно подключиться к серверу: невозможно настроить порт данных

Кроме того, должен быть более интеллектуальный способ извлечения данных из буфера потока, чем побайтовый, не так ли? Я тоже не могу найти это.

Наконец, мне нужно сделать доступ как по http, так и по ftp, есть ли причина не использовать URLConnection для обоих типов доступа? или лучше использовать HttpConnection для http и URLConnection для ftp?

Спасибо!


person Paul Kinzelman    schedule 13.08.2011    source источник
comment
У вас есть разрешение на использование Интернета в вашем манифесте?   -  person Jack    schedule 14.08.2011
comment
Да, я потратил пару часов на это, это было бы хорошей догадкой несколько часов назад. :-) У меня заработал http, но не ftp.   -  person Paul Kinzelman    schedule 14.08.2011
comment
Я также заметил, что если я ввожу этот URL-адрес в google на эмуляторе, он говорит, что веб-страница недоступна, и она есть в обычном браузере. Если я наберу этот URL-адрес прямо в окне браузера, он займет всего 50 символов, а не весь. Есть ли эти ошибки в эмуляторе?   -  person Paul Kinzelman    schedule 14.08.2011
comment
Пожалуйста помоги! Или же, если ftp не работает на эмуляторе Eclipse, сообщите мне об этом и предложите обходной путь. И работает ли это на реальном оборудовании?   -  person Paul Kinzelman    schedule 16.08.2011


Ответы (3)


Вау! У меня наконец-то получилось. Я отказался от простого способа, который работает в webOS и WPF/C#, где вы можете просто сделать ftp:://... вам нужно использовать пакет FTPClient.

После исправления доступа к библиотеке (Проект | Свойства | Путь сборки Java | Библиотеки | Добавить JAR...) я возился с вызовами, пока он не начал работать. Вот последовательность моих вызовов FTPClient. Это не сработает, пока я не переведу его в пассивный режим.

  mFTPClient = new FTPClient();
  mFTPClient.connect("tgftp.nws.noaa.gov");      
  mFTPClient.login("anonymous","nobody");
  mFTPClient.enterLocalPassiveMode();
  mFTPClient.changeWorkingDirectory("/data/forecasts/taf/stations");
  InputStream inStream = mFTPClient.retrieveFileStream("KABQ.TXT");
  InputStreamReader isr = new InputStreamReader(inStream, "UTF8");
person Paul Kinzelman    schedule 17.08.2011
comment
Похоже, я могу объединить путь к каталогу и файл в одном вызове: InputStream inStream = mFTPClient.retrieveFileStream(/data/forecasts/taf/stations/KABQ.TXT); - person Paul Kinzelman; 17.08.2011
comment
Я пытаюсь сделать то же самое, что и вы, только с другой станцией. Мы можем увидеть ваш код? - person traisjames; 23.04.2015

И я также нашел где-то в Интернете ответ на вопрос «побайтно». Кажется, это работает для преобразования типа InputStream непосредственно в тип String:

      String theStr = new Scanner(inStream).useDelimiter("\\A").next();
person Paul Kinzelman    schedule 17.08.2011

Я также искал простой пример загрузки по ftp без использования сторонних библиотек. Не нашел, поэтому опубликуйте мое решение здесь.

URLConnection по умолчанию использует имя пользователя «анонимный» с пустым паролем, который не принимается многими ftp-серверами, поскольку они требуют адрес электронной почты в качестве пароля для «анонимного».

Чтобы использовать следующий код в своем приложении, просто добавьте try..catch и убедитесь, что чтение из потока не блокирует поток пользовательского интерфейса.

URL url = new URL("ftp://ftp.mozilla.org/README");
URLConnection cn = url.openConnection();
cn.setRequestProperty ("Authorization", "Basic " + Base64.encodeToString("anonymous:[email protected]".getBytes(), Base64.DEFAULT));

final File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
FileOutputStream fos = new FileOutputStream(dir.getPath() + "/README");

InputStream is = cn.getInputStream();
int bytesRead = -1;
byte[] buf = new byte[8096];
while ((bytesRead = is.read(buf)) != -1) {
    fos.write(buf, 0, bytesRead);
}
if(is != null)is.close();
if(fos != null){ fos.flush(); fos.close(); }

Надеюсь, это сэкономит вам время.

person Alex    schedule 09.02.2014