Autore Topic: Invio file server ftp  (Letto 5335 volte)

Offline dodopepper

  • Utente junior
  • **
  • Post: 124
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32a black
Invio file server ftp
« il: 19 Aprile 2010, 11:16:28 CEST »
0
Salve a tutti, avrei bisogno di una mano per l'invio di file verso un server ftp su android. Sapreste indirizzarmi verso qualche guida- documento eccecc? Così magari potrei postare anche una guida a lavoro ultimato! Grazie mille a tutti in anticipo
« Ultima modifica: 15 Maggio 2010, 17:23:30 CEST da JD »

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Invio file server ftp
« Risposta #1 il: 19 Aprile 2010, 12:26:41 CEST »
0
Su Google Code ho trovato un interessante classe FtpHelper:
Codice (Java): [Seleziona]
package com.sunshine.qftp.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

import com.sunshine.qftp.config.FtpParameter;
import com.sunshine.qftp.listener.MessageListener;

public class FtpHelper {

        public static boolean testConnect(FtpParameter ftp) {
                FTPClient client = null;
                try {
                        client = new FTPClient();
                        client.connect(ftp.getIp(), ftp.getPort());
                        int reply = client.getReplyCode();
                        if (!FTPReply.isPositiveCompletion(reply)) {
                                client.disconnect();
                                return false;
                        }
                        if (!client.login(ftp.getUsername(), ftp.getPassword())) {
                                return false;
                        }
                } catch (Exception e) {
                        return false;
                } finally {
                        if (client != null && client.isConnected()) {
                                try {
                                        client.disconnect();
                                } catch (IOException e) {
                                }
                        }
                }
                return true;
        }

        public static String getReplyMessage(FTPClient client) {
                StringBuffer sb = new StringBuffer();
                // sb.append(client.getReplyCode());
                sb.append(client.getReplyString());
                // String[] strs = client.getReplyStrings();
                // for(String str:strs){
                // sb.append(str);
                // sb.append("\n");
                // }
                return sb.toString();
        }

        public static boolean testConnect(FtpParameter ftp, MessageListener listener) {
                FTPClient client = null;
                try {
                        client = new FTPClient();
                        client.connect(ftp.getIp(), ftp.getPort());
                        int reply = client.getReplyCode();
                        listener.appendMessage(getReplyMessage(client));
                        if (!FTPReply.isPositiveCompletion(reply)) {
                                client.disconnect();
                                return false;
                        }
                        if (!client.login(ftp.getUsername(), ftp.getPassword())) {
                                listener.appendMessage(getReplyMessage(client));
                                return false;
                        } else {
                                listener.appendMessage(getReplyMessage(client));
                                return true;
                        }
                } catch (Exception e) {
                        return false;
                } finally {
                        if (client != null && client.isConnected()) {
                                try {
                                        client.disconnect();
                                } catch (IOException e) {
                                }
                        }
                }
        }

        public static FTPClient connect(FtpParameter ftp, MessageListener listener) throws Exception {
                FTPClient client = null;
                try {
                        client = new FTPClient();
                        client.setDataTimeout(ftp.getTime_out());
                        try{
                                client.connect(ftp.getIp(), ftp.getPort());
                        }catch (Exception e) {
                                throw new Exception("ÎÞ·¨Á¬½Óµ½Ö÷»ú,Ö÷»úÃû:"+ftp.getIp()+",¶Ë¿Ú:"+ftp.getPort());
                        }
                        listener.appendMessage(client.getReplyString());
                        int reply = client.getReplyCode();
                        listener.appendMessage(getReplyMessage(client));
                        if (!FTPReply.isPositiveCompletion(reply)) {
                                client.disconnect();
                                return null;
                        }
                        if (!client.login(ftp.getUsername(), ftp.getPassword())) {
                                listener.appendMessage(getReplyMessage(client));
                                return null;
                        } else {
                                listener.appendMessage(getReplyMessage(client));
                                return client;
                        }
                } catch (Exception e) {
                        throw e;
                }
        }

        private static void _download(FTPClient ftp, FTPFile src, String dest) throws Exception {

                try {
                        ftp.setFileType(FTP.BINARY_FILE_TYPE);

                        if (src.isFile()) {
                                OutputStream os;

                                File fileDir = new File(dest);
                                if(!fileDir.exists()){
                                        fileDir.mkdirs();
                                }
                                String newdir = "";
                                if (dest.endsWith("/")) {
                                        newdir = dest + src.getName();
                                } else {
                                        newdir = dest + "/" + src.getName();
                                }
                                File file = new File(newdir);
                                if(!file.exists()){
                                        file.createNewFile();
                                }
                                os = new FileOutputStream(file);

                                ftp.retrieveFile(src.getName(), os);
                                os.close();

                        } else {
                                ftp.changeWorkingDirectory(src.getName());
                                String newdir = "";
                                if (dest.endsWith("/")) {
                                        newdir = dest + src.getName();
                                } else {
                                        newdir = dest + "/" + src.getName();
                                }

                                try {
                                        File file = new File(newdir);
                                        if (!file.exists()) {
                                                file.mkdirs();
                                        }
                                } catch (Exception e) {
                                }
                                FTPFile[] files = ftp.listFiles();
                                for (FTPFile file : files) {

                                        _download(ftp, file, newdir);
                                }
                        }
                } catch (Exception e) {
                        throw e;
                }
        }

        public static void upload(FTPClient ftp, File src, String dest) {
                try {
                        ftp.setFileType(FTP.BINARY_FILE_TYPE);

                        ftp.changeWorkingDirectory(dest);
                        if (src.isFile()) {
                                InputStream input;

                                input = new FileInputStream(src);

                                String newdir = "";
                                if (dest.endsWith("/")) {
                                        newdir = dest + src.getName();
                                } else {
                                        newdir = dest + "/" + src.getName();
                                }
                                boolean rst = ftp.storeFile(newdir, input);
                                System.out.println(rst + ":" + ftp.getReplyString());

                                input.close();
                        } else {
                                String newdir = "";
                                if (dest.endsWith("/")) {
                                        newdir = dest + src.getName();
                                } else {
                                        newdir = dest + "/" + src.getName();
                                }

                                try {
                                        boolean rst = ftp.makeDirectory(newdir);
                                        System.out.println(rst + ":" + ftp.getReplyString());

                                } catch (Exception e) {
                                }
                                File[] files = src.listFiles();
                                for (File file : files) {

                                        upload(ftp, file, newdir);
                                }
                        }
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }

        public static void download(FTPClient ftp, String src, String dest)
                        throws Exception {
                boolean rst = ftp.changeWorkingDirectory(src);
                if (rst) {
                        if (src.endsWith("/")) {
                                src = src.substring(0, src.length() - 1);
                        }
                        String name = src.substring(src.indexOf("/") + 1);
                        if(dest.endsWith("/")){
                                dest = dest  + name;
                        }else{
                                dest = dest + "/" + name;
                        }
                        dest = dest.replaceAll("//", "/");
                }
                FTPFile[] files = ftp.listFiles(src);
                for (FTPFile file : files) {
                        _download(ftp, file, dest);
                }
        }
}

Prova a dare uno sguardo a questi indirizzi:

PS
Fammi sapere se conti di farci su un tutorial ;)
« Ultima modifica: 19 Aprile 2010, 12:36:37 CEST da JD »
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline dodopepper

  • Utente junior
  • **
  • Post: 124
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32a black
Re:Invio file server ftp
« Risposta #2 il: 19 Aprile 2010, 13:20:21 CEST »
0
Ciao JD, grazie della risposta!! Stavo smanettando un po' con le api di apache che mi hai indicato, le avevo beccate anche io! Solo che sto impazzendo per vari motivi:
A- non conosco l'indirizzo di un server ftp (sto provando con ftp.foobar.com ma cercando le risposte con getReply() non viene modificata la textview
B- ho provato a crearmi un server in locale all'indirizzo 127.0.0.1 con FileZilla Server ma non so come dichiara un InetAddress cioè faccio del tipo
     Inet4Address indirizzo= 127.0.0.1; ma chiaramente da errore.

Ora vi mostro il codice abbozzato!

Codice (Java): [Seleziona]
 TextView risposta = (TextView) findViewById(R.id.Risposta_server);
        //Il seguente codice dovrebbe implementare l'upload del file verso il server ftp
        FTPClient client= new FTPClient();
        try {
                //Inet4Address indirizzo= (127.000.000.001);
                        client.connect("ftp.foobar.com");
                        risposta.setText(client.getReplyString());
                        /*
                        boolean ok = client.login("giorgio", "giorgio");
                        if(ok==true) risposta.setText("login valido");
                        else risposta.setText("login non valido"); */
                 
                       
                } catch (SocketException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }

Cmq certo, farò volentieri il tutorial è il minimo che possa fare!!!


EDIT: In tutto questo sono un pivello perchè devo innanzitutto impostare le permission nel manifest sennò col cavolo che  si connette alla rete! Da dire che prima provavo sul terminale fisico con la connessione dati disattivata! dehehihoh!

RIEDITO: Si, sono decisamente un baccalà, non avevo abilitato i permessi! Ora la risposta mi arriva! Grandioso! Il prossimo passo e fare l'upload e download dei file così posso provare a fare un tutorial + completo! GRAZIE JD!!
« Ultima modifica: 19 Aprile 2010, 13:26:57 CEST da dodopepper »

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Invio file server ftp
« Risposta #3 il: 19 Aprile 2010, 13:51:11 CEST »
0
Per quanto riguarda il server FTP puoi crearlo direttamente col tuo telefono tramite SwiFTP, io lo uso per accedere alla SD del N1 dal PC tramite WiFi.

Occhio che 127.x.x.x è l'indirizzo associato all'interfaccia di loopback, meglio utilizzare l'indirizzo associato alla tua interfaccia di rete (generalmente qualcosa di simile a 192.168.1.100 se utilizzi il DHCP), raggiungibile da tutti
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline dodopepper

  • Utente junior
  • **
  • Post: 124
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32a black
Re:Invio file server ftp
« Risposta #4 il: 19 Aprile 2010, 13:56:23 CEST »
0
eh ma l'indirizzo di tipo 192.x.x.x è sempre un indirizzo di sottorete locale, quindi ci posso accedere fintantoché uso l'emulatore ma da terminale fisico su rete dati gprs non me lo vede! Bisognerebbe andare a guardare con che indirizzo esco all'esterno!

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Invio file server ftp
« Risposta #5 il: 19 Aprile 2010, 13:58:37 CEST »
0
Non hai possibilità di far connettere il telefono tramite wifi alla LAN?

Tramite GPRS potresti anche non uscire con un IP pubblico ma essere nattato come capita con fastweb ad esempio. Se esci con un indirizzo pubblico puoi leggerlo facilmente andando con il browser del telefono su http://www.ip-adress.com/
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline dodopepper

  • Utente junior
  • **
  • Post: 124
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32a black
Re:Invio file server ftp
« Risposta #6 il: 19 Aprile 2010, 15:00:12 CEST »
0
potrei provare a casa (non capisco perchè ma non  riesco mai a connettermi con il magic alla rete dell'università, c'ho provato in mille modi, eppure ho la 2.1 sopra! Boh) ma comunque non so come si mette l'indirizzo Inet cioè se io volessi portare l'indirizzo 127.0.0.1 sotto forma di Inet4Address o comunque InetAddress(cioè la classe padre) come diavolino potrei fare? Probabilmente è una cosa idiota ma non mi riesce!

EDIT: Trovato! Bastava fare un po' di ricerca + approfondita!!!!!
« Ultima modifica: 19 Aprile 2010, 15:08:09 CEST da dodopepper »

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Invio file server ftp
« Risposta #7 il: 19 Aprile 2010, 15:13:09 CEST »
0
Non l'ho provato ma dovrebbe bastare un semplice
Codice (Java): [Seleziona]
InetAddress.getByName("127.0.0.1");
EDIT:
Come hai risolto alla fine?
« Ultima modifica: 19 Aprile 2010, 15:15:15 CEST da JD »
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline dodopepper

  • Utente junior
  • **
  • Post: 124
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32a black
Re:Invio file server ftp
« Risposta #8 il: 19 Aprile 2010, 15:28:09 CEST »
0
esattamente come hai fatto tu!! Solo che comunque non riesco ad accedere dall'emulatore! Ora vedo se riesco ad avere l'indirizzo di un server su cui provare!

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Invio file server ftp
« Risposta #9 il: 19 Aprile 2010, 15:44:07 CEST »
0
Non ho trovato un modo per far accedere l'emulatore alla lan (e quindi a i server su essa disponibili).
Secondo me la soluzione più semplice è installare SwiFTP e crearti il server FTP direttamente sull'emulatore.
In alternativa, se hai possibilità di configurare un virtual server, puoi mappare la porta 21 sul tuo router e crearti un serve direttamente sul tuo PC.

L'ultima soluzione è registrarti in qualche community, come ad esempio www.altervista.org, che fornisca uno spazio web accessibile tramite FTP.

Fammi sapere :)
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline dodopepper

  • Utente junior
  • **
  • Post: 124
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32a black
Re:Invio file server ftp
« Risposta #10 il: 19 Aprile 2010, 16:09:28 CEST »
0
Sono riuscito a fare l'upload sulla foto di un server che mi ha fornito l'uni ma quando vado a riscaricarla per vedere se si vede ho notato che mi da errore nel bytestream. il codice della scrittura è


Codice (Java): [Seleziona]
                        File sdcardDir = Environment.getExternalStorageDirectory();
                        File file = new File(sdcardDir,"fotografia.jpeg");
                        FileInputStream fis = new FileInputStream(file);                       
                        DataInputStream dis = new DataInputStream(fis);
                        boolean upload_ok=client.storeFile("fotografia.jpeg", dis);
                        dis.close();
                        //PROBLEMA il file viene trasmesso correttamente ma risulta NON interpretabile
                        if(upload_ok==true)risposta.append("  ..... upload ok");
                        else risposta.append("....upload fallito");
                       

detto questo le dimensioni del file uploadato e quello originale sono leggermente diverse:
originale: 1.328.387 byte
caricata: 1.332.070 byte

che cavolo succede? Ho provato + volte ma niente da fare!

Offline dodopepper

  • Utente junior
  • **
  • Post: 124
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32a black
Re:Invio file server ftp
« Risposta #11 il: 20 Aprile 2010, 14:05:11 CEST »
0
gente nessuno sa darmi una mano? sto dando di matto con questo problema! continua a darmi problemi l'upload!

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Invio file server ftp
« Risposta #12 il: 20 Aprile 2010, 14:28:06 CEST »
0
Se alleghi un archivio dell'intero progetto eclipse posso provare a darci uno sguardo,  ma non ti prometto nulla, sto parecchio preso con l'università in sto periodo...
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline dodopepper

  • Utente junior
  • **
  • Post: 124
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32a black
Re:Invio file server ftp
« Risposta #13 il: 20 Aprile 2010, 14:50:12 CEST »
0
Ho risolto! Semplicemente dovevo dichiarare il tipo di  flusso  che avrei inviato!! Sono pronto afare un piccolo tutorial

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Invio file server ftp
« Risposta #14 il: 20 Aprile 2010, 14:58:11 CEST »
0
Ottimo :)
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !