Как сделать простой 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 ответа:
Фу! Я наконец-то добился своего. Я отказался от простого способа, который работает в 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(); }
Надеюсь, это сэкономит вам немного времени. время.