FTP Down-/Upload

Hiho,

heute würde ich gern eine Verbindung zu meinem FTP-Server herstellen. Dafür gibt es scheinbar nur eine einzig wahre Möglichkeit. Nämlich die von Apache Commons Net. Ich habe nun schon den Code von 6 verschiedenen Seiten ausprobiert. Mein Problem liegt an folgender Stelle:

FTPClient client = new FTPClient();

Sobald er an diesen Punkt kommt, stoppt mein Programm und markiert diese Zeile. Ich habe auch schon eine Library von einer anderen Seite probiert. Funktioniert leider auch nich. Mein Code sieht folgendermaßen aus:

    {
       
         FTPClient client = new FTPClient();
         FileOutputStream fos = null;
     
         try {
             client.connect("ftp://www1.subdomain.com");
             client.login("--user--","--passwort--");
     
            //
            // The remote filename to be downloaded.
            //
            String filename = "test.txt";
            fos = new FileOutputStream(filename);
     
            //
            // Download file from FTP server
            //
            client.retrieveFile("/www/" + filename, fos);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fos != null) {
                    fos.close();
                }
                client.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
     
       
       
    }```

Hat jemand ne Idee woran das liegen könnte? Hab als Berechtigung das Internet hinzugefügt. Er bleibt wie gesagt bei dieser einen Zeile hängen. Die App stürzt dann einfach ab. Wenn ich wirklich -nur- diese Zeile drin habe stürzt er auch ab. Ich kann mir nicht so recht vorstellen was er dagegen hat :S

Was heisst denn “er stürzt ab” ? Fällt der Rechner voom Tisch? Freeze? Gibt es evntl. ne Fehlermeldung?

Sieht für mich danach aus, als ob die Library fehlt. Wenn er eine Klasse laden will wirft es eine ClassNotFoundException und die App müsste abstürzen.
Überprüf doch mal ob die Klassen auch in der apk enthalten sind, bzw. im Classpath enthalten sind (falls es das bei Android überhaupt gibt, hab wenig Ahnung davon).

ausgezeichnete Frage :wink:
Die App stürzt ab. Bedeutet, dass alles schwarz bleibt und die Oberfläche nicht geladen wird (weil ich das mit dem FTP-Zugriff gleich beim Start probiere). Nach einigen Sekunden lande ich wieder auf meinem Startbildschirm vom Handy und bekomme die Meldung „Application-TEST wurde angehalten“.

Zu dem 2. Tipp:
wie bekomme ich das heraus? Ich bin leider noch recht frisch in Sachen Java und Eclipse. Kannst du mir da ein wenig unter die arme greifen? Wenn ich im Projektexplorer links unter Referenced Librarys gucke, sehe ich da „commons-net-3.3-sources.jar“

Nun ja, es geht also um eine AndroidApp, hab ich wohl verpasst, dass das angesagt wurde. Naja, die FTP-Verbindung an sich ist ja nun kein reines Androidproblem, daher würde ich an deiner Stelle die gesamte FTP-Geschichte mal auf deinem Rechner ohne den Adroidkram zum laufen bringen, bevor ich das dann zu Android portiere.
Ich bin wenig mit Android bewandert aber dennoch findet man so eher mal ein Problem und evntl. gibts mal ne exception.

das problem hat er doch gepostet

“commons-net-3.3-sources.jar”

klar … kann man auch nutzen … dürfte sich aber so nicht einfach in eine IDE einbinden lassen
lad dir also die binaries … sollte hinhauen

zur not : man kann auch über java.net.URL auf einen FTP zugreifen …

[QUOTE=Unregistered]das problem hat er doch gepostet

“commons-net-3.3-sources.jar”

klar … kann man auch nutzen … dürfte sich aber so nicht einfach in eine IDE einbinden lassen
lad dir also die binaries … sollte hinhauen

zur not : man kann auch über java.net.URL auf einen FTP zugreifen …[/QUOTE]

ist dieses .jar kein binary? :S sorry, ich wäre über aufklärung erfreut

Wie der Dateiname schon sagt, es handelst sich dabei um die Sources, also .java Dateien. Wundert mich allerdings, das es mit denen alleine überhaupt compiliert.
Du brauchst die binary Version, in der die compilierten .class Dateien enthalten sind.

Hiho, ich hab mal in einer “normalen” Anwendung, sprich nicht für Android folgendes getestet:

{
	 String ftpUrl = "ftp://%s:%s@%s/%s;type=i";
     String host = "www1.subdomain.com";
     String user = "user";
     String pass = "pw";
     String filePath = "/www/test.txt";
     String savePath = "/storage/emulated/0/test123321.txt";

     ftpUrl = String.format(ftpUrl, user, pass, host, filePath);
     System.out.println("URL: " + ftpUrl);

     try {
         URL url = new URL(ftpUrl);
         URLConnection conn = url.openConnection();
         InputStream inputStream = conn.getInputStream();

         FileOutputStream outputStream = new FileOutputStream(savePath);

         byte[] buffer = new byte[BUFFER_SIZE];
         int bytesRead = -1;
         while ((bytesRead = inputStream.read(buffer)) != -1) {
             outputStream.write(buffer, 0, bytesRead);
         }

         outputStream.close();
         inputStream.close();

         System.out.println("File downloaded");
     } catch (IOException ex) {
         ex.printStackTrace();
     }
 }```

Das funktioniert super. Wenn ich das aber genau so in mein Android-Projekt kopiere, geht nichts mehr. Kann sich das einer erklären? Danke :)

Vielleicht solltest du das mal in der Android Abteilung fragen. Da braucht man sicher andere Plugins als bei den normalen Anwendungen.

*** Edit ***

Hier ist sogar nen kleines HowTo
http://royvandewater.com/2010/10/uploading-a-file-to-ftp-with-android/

Lass das mit FTP mal lieber sein, außer du willst missbraucht werden ^^

Wenn ich das aber genau so in mein Android-Projekt kopiere, geht nichts mehr.

Anhand solcher Beschreibungen lässt sich schwerlich eine Ursache nennen. Wie äußert sich das „geht nichts mehr“? Exception, Programmabsturz? Unerwartete Ergebnisse? Bis zur Lieferung einer genaueren Beschreibung von mir etwas Raterei:
String savePath = "/storage/emulated/0/test123321.txt";
Der Save-Path ist hart codiert. Wenn Du die Anwendung genau so in Dein Android-Projekt kopierst, wird dieser alsoauch dort zum Speichern verwendet. Möglicherweise gibt es diesen Path dort schlicht so nicht.

was auch sein könnte : Apache Commons ist nicht für die verwendung auf Android ausgelegt … macht also im konstruktor irgendwas was auf Android nicht geht (wäre ja nicht das erste mal das Apache den fehler macht und direkt auf sun.* klassen zugreift obwohl in jedem anfänger-buch steht das man sowas nicht machen soll)

persönlich halte ich eh nicht viel von den ach so hoch-gelobten commons … in meinen augen einfach überbewertet nach dem motto : die anderen nutzen es ja auch

sollte der fehler also wirklich die zeile mit dem konstruktor-aufruf sein gibts leider nur eine antwort : du kannst in deinem projekt die apache commons leider nicht nutzen

btw : wobei ich mich immer wieder frage wie leute auf diese wahn-witzige idee kommen irgendwelche zugangsdaten mit in die binaries packen zu wollen … ich erinner mich da an so einige fälle der vergangenheit wo dann auch gleich mal die login-daten im forum gepostet und die zugänge übernommen wurden …
wenn man also keine möglichkeit einer eigenen server-software hat die sowas regelt bleibt einem meist nur der webservice …

Hi vielen dank für die ganzen Tipps. Um es einfach zu sagen: Ich habe einen Kalender auf dem Computer und einen auf dem Handy (beide selbst programmiert). Die daten liegen in einer XML-Datei (testweise. später in einer sql datei,aber egal). Meine Frage: wie stelle ich es an, die datei vom rechner aufs handy zu bekommen? ohne jedesmal vor dem Verlassen des Hauses eine Synchronisation zu vollziehen. Dafür wollte ich eigentlich Dropbox nutzen. Also, dass am Rechner die XML Datei einfach in den DropBox ordner gespeichert wird. Automatisch wird sie ja dann hochgeladen. Am rechner alles kein Problem. Doch wie greife ich dann auf Dropbox vom handy zu ? Habs wirklich wirklich nicht hinbekommen bisher. Schade…

Welche Alternativen gibt es sonst? Der Rechner läuft nicht die ganze Zeit -> Ein Webservice von Zuhause aus ist also keine Alternative. Oder wie genau war es gemeint mit dem Service?

Hat denn iiirgendjemand Erfahrung damit, Daten aus dem Internet zu laden, zu bearbeiten und am ende wieder hochzuladen? Vielen Dank!

Gruß

Nur für deinen privaten Gebrauch ist die Variante mit Dropbox nicht verkehrt. Was hast du denn schon unternommen um an den Orderzu kommen ?

Hiho,
also zu meinen Versuchen mit DropBox:
ich habe mich versucht in die kleinen Beispiele ein zu arbeiten. u.A. habe ich dieses hier versucht:
https://www.dropbox.com/developers/sync/start/android
Dazu habe ich hier:
https://www.dropbox.com/developers/sync/sdks/android

das sdk herunter geladen und den lib ordner in den libs ordner meines projektes kopiert. In Eclipse habe ich dann über Build Path -> Java Build Path -> Add external JAR die datei “dropbox-sync-sdk-android.jar” eingebunden. Ist das so richtig bis hierher? Wenn ich jetzt wie auf der Seite beschrieben, folgendes mache:

private DbxAccountManager mDbxAcctMgr;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mDbxAcctMgr = DbxAccountManager.getInstance(getApplicationContext(), APP_KEY, APP_SECRET);
}

dann öffnet die App sich garnicht und ich bekomme die meldung auf den Bildschirm “Applikation wurde angehalten”.

Woran kann das liegen? Muss ich die Jar datei anders einbinden? Danke sehr

EDIT:
habe gerade mal ein Example direkt von Dropbox geöffnet. Da sind Beispieldaten angegeben (man muss ja nen app-key und app-secret angeben). Wenn diese Beispieldaten drin sind, startet die example-app. Gebe ich aber meine eigenen Daten an, dann stürzt sie gleich ab oO Wie kann das denn sein? Ich hab mir sogar gerade noch einmal neue secret und key daten erzeugt.

Wie wärs mit nen ordentlichen Webservice?

Interessant. Ich habe davon leider keine Ahnung und weiß, ich muss mich informieren, aber kannst du mir in kurzer Zusammenfassung erzählen wie soetwas zu bewerkstelligen ist und wie genau das mit Android zusammenspielen würde? Bräuchte ich dazu einen Server (Hier zuhause ist das leider nicht zu bewerkstelligen), also sonen Free Webspace? Oder muss das was bestimmtes sein?

Vielen Dank,

PS:
Hat noch jemand eine Idee woran es liegen kann, dass ich mich mit meinem Key und meinem Secret nicht zu Dropbox verbinden kann?

vielleicht daran das du zwar dein secret im source änderst aber nicht wie im beispiel auch im manifest

ansonsten ist es schon sehr komisch das du die examples zum laufen bekommst aber es nur daran scheitern soll das du halt deine daten eingibst

[QUOTE=Unregistered]vielleicht daran das du zwar dein secret im source änderst aber nicht wie im beispiel auch im manifest

ansonsten ist es schon sehr komisch das du die examples zum laufen bekommst aber es nur daran scheitern soll das du halt deine daten eingibst[/QUOTE]

wie blöd kann man nur sein. Genau das war es. Tausend Dank! Ich versteh / verstand nicht, warum man den Key 2x angeben soll. Ich dachte ich kann mir sozusagen aussuchen ob ich ihn da oder da angebe. Also so klappt es!