Cómo hacer un archivo ftp get simple en Android

No puedo encontrar un ejemplo de acceso simple a FTP de un archivo en cualquier lugar, y la clase FTPClient (que usan algunos ejemplos) no aparece en el índice de clase de Android. Tengo el acceso http funcionando, pero ¿cómo hago un simple FTP? Todo lo que quiero hacer es descargar (por ejemplo): ftp://tgftp.nws.noaa.gov/data/observations/metar/stations/KABQ.TXT No debe requerir iniciar sesión, cambiar el directorio, etc. Solo dar eso La URL de los métodos de acceso http no parece funcionar.

Esto es similar a la pregunta en: ¿ no se puede leer el archivo desde ftp en android?

Intenté un simple:

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"; } 

pero obtiene una excepción en getInputStream: no se puede conectar al servidor: no se puede configurar el puerto de datos

Además, debe haber una manera más inteligente de extraer los datos del búfer de transmisión que byte por byte, ¿no? No puedo encontrar eso tampoco.

Por último, necesito hacer acceso tanto a http como a ftp, ¿hay alguna razón para no usar URLConnection para ambos tipos de acceso? o ¿es mejor usar HttpConnection para http y URLConnection para ftp?

¡Gracias!

¡Uf! Finalmente lo tengo en marcha. Me di por vencida de la manera simple que funciona en webOS y WPF / C # donde puedes hacer un ftp :: // … tienes que usar el paquete FTPClient.

Después de arreglar el acceso a la biblioteca (Proyecto | Propiedades | Java Build Path | Libraries | Add JARs …) Jugueteé con las llamadas hasta que comenzó a funcionar. Aquí está la secuencia de mis llamadas FTPClient. No funcionaría hasta que lo configuré en modo pasivo.

  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"); 

Y también encontré en la web en algún lugar una respuesta a la pregunta ‘byte por byte’. Esto parece funcionar para convertir un tipo de InputStream directamente al tipo de cadena:

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

También busqué un simple ejemplo de descarga ftp sin usar libs de terceros. No encontré ninguno, así que publique mi solución aquí.

URLConnection utiliza por defecto el nombre de usuario ‘anonymous’ con contraseña vacía que no es aceptada por muchos servidores ftp, ya que requieren el correo electrónico como contraseña para ‘anonymous’.

Para usar el siguiente código en tu aplicación, simplemente agrega try..catch y asegúrate de que la lectura de la transmisión no sea una hebra de UI de bloque.

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

Espero que esto te ahorre algo de tiempo.