2011-08-13 12 views
5

no puedo encontrar un ejemplo de un simple acceso FTP de un archivo en cualquier lugar, y la clase FtpClient (que utilizan un par de ejemplos) no aparece en el índice de clase 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. Simplemente dando esa URL a los métodos de acceso http no parece funcionar.Howto hacen un ftp sencillo conseguir el archivo en Android

Esto es similar a la cuestión en: unable to read file from ftp in android?

He intentado 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 se hace una excepción en getInputStream: No se puede conectar al servidor: No se puede configurar el puerto de datos

Además, tiene que haber una manera más inteligente para extraer los datos del búfer de la secuencia de byte a byte, no está allí? No puedo encontrar eso tampoco.

Por último, tengo que hacer tanto el acceso HTTP y 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!

+0

¿Tiene un permiso de uso de Internet en su manifiesto? – Jack

+0

Sí, pasé un par de horas con eso, eso hubiera sido una buena suposición hace varias horas. :-) Hice que http trabajara pero no ftp. –

+1

También noté que si escribo esa URL en Google en el emulador, dice "La página web no está disponible" y está allí en un navegador normal. Si escribo esa URL directamente en la ventana del navegador, parece tomar solo 50 caracteres, no tomaré todo. ¿Estos errores están en el emulador? –

Respuesta

8

Whew! 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 fijar el acceso a la biblioteca (Proyecto | Propiedades | Vía de construcción Java | Bibliotecas | Añadir JAR ...) Jugué con las llamadas hasta que comenzó a trabajar. 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"); 
+0

Parece que puedo combinar la ruta del directorio y el archivo en la misma llamada: InputStream inStream = mFTPClient.retrieveFileStream ("/ data/forecasts/taf/stations/KABQ.TXT"); –

+3

Qué biblioteca externa necesito usar ... – Pradeep

+0

Estoy tratando de hacer exactamente lo mismo que usted, solo con una estación diferente. ¿Podemos ver tu código? – traisjames

2

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 InputStream directamente al tipo String:

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

También busqué un ejemplo sencillo de ftp descarga sin necesidad de utilizar librerías de 3 ª parte. No encontré ninguno, así que publique mi solución aquí.

URLConnection utiliza de forma predeterminada el nombre de usuario 'anonymous' con una 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 utilizar el siguiente código en su aplicación, sólo tiene que añadir try..catch y asegúrese de que la lectura de la corriente no es bloquear el hilo de interfaz de usuario.

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(); } 

Espero que esto le ahorrará algo de tiempo.

Cuestiones relacionadas