Как сделать простой FTP получить файл на Android - PullRequest
5 голосов
/ 14 августа 2011

Я не могу найти пример простого 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 ]

9 голосов
/ 17 августа 2011

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

После исправления доступа к библиотеке (Project | Properties | Java Build Path | Libraries | Add 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");
2 голосов
/ 17 августа 2011

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

      String theStr = new Scanner(inStream).useDelimiter("\\A").next();
1 голос
/ 09 февраля 2014

Я также искал простой пример загрузки по 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: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(); }

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

...