Как сделать простой ftp get файл на 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?

Спасибо!

3 5

3 ответа:

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

После исправления доступа к библиотеке (Project / Properties / Java Build Path / Libraries / Add JARs...) Я возился с вызовами, пока он не начал работать. Вот последовательность моих вызовов 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");

И я также нашел в интернете где-то ответ на вопрос "байт за байтом". Это, кажется, работает для преобразования типа InputStream непосредственно в строковый тип:

      String theStr = new Scanner(inStream).useDelimiter("\\A").next();

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

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

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

URL url = new URL("ftp://ftp.mozilla.org/README");
URLConnection cn = url.openConnection();
cn.setRequestProperty ("Authorization", "Basic " + Base64.encodeToString("anonymous:a@b.c".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(); }

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