Download Binary Files mit PhoneGap

Es gibt sicher eine Menge nützlicher Anwendungsfälle, wo Apps Daten aus dem Netz herunterladen müssen (zum Beispiel um Daten offline verfügbar zu machen). Textfiles kann man per Ajax sehr leicht auf das Telefon laden. Anders sieht das mit Binärdateien aus. Egal ob Bilder, PDFs oder was auch immer – standardmäßig geht das mit PhoneGap leider nicht. Da sich PhoneGap im Netz jedoch großer Beliebtheit erfreut, werden solche Schwächen mehr oder weniger schnell durch andere Entwickler ausgeglichen.

Leider gibt es wie bei PhoneGap selbst auch (noch) das Problem, dass es keine einheitlichen Klassennamen, Interface bzw. Funktionssignaturen gibt. So schreibt der eine ein Plugin für Android und ein anderer eins für iOS. Beide sollen dem gleichen Zweck dienen, sind aber oft grundlegend verschieden implementiert. Hier sollte es vielleicht ein paar mehr Vorgaben für Plugin-Entwickler Seitens der PhoneGap-Macher geben. Das würde die Portierung eine App von einem System auf das andere etwas einfacher machen.

So habe ich auch zwei Plugins zum Downloaden von Files gefunden. Aaron K. Saunders hat dies für iOS implementiert und Mauro Rocco für Android. Diese Plugins habe ich so umgeschrieben, dass sie auf JavaScript-Ebene gleich angesprochen werden können und mit PhoneGap 1.0 kompatibel sind. Man findet beide auf github: iOS, Android.

Ich wünsche viel Spaß damit und danke Aaron und Mauro für die Vorarbeit!

14 Gedanken zu „Download Binary Files mit PhoneGap

  1. Darius sagt:

    Hi,
    Das sieht ja echt gut aus, aber ich bekomme das nicht zum Laufen. Könnten Sie eine ausführlichere Readme dafür aufführen? Das wäre echt toll.

    • Was genau funktioniert denn nicht? Welches Plugin? Sofern man die Plugins im Projekt bekannt gemacht hat (in der plugin.xml bei Android oder in PhoneGap.plist bei iOS) und die JS-Files geladen hat, sollte das ohne Probleme funktionieren.

  2. Darius sagt:

    Vielen Dank für die schnelle Antwort. Bei mir kommt immer in der Console eine Rückmeldung, dass das Plugin nicht existent sei. Was sind denn Key und String? Sind „Downloader“, „downloadFile“ richtig?

  3. Patrick Hafner sagt:

    Hallo, sehr gute Arbeit, benutze das Plugin selbst.

    Allerdings habe ich ein Problem.
    Ich möchte beim Start meiner iOS PhoneGap App Bilder in den „Documents“ Ordner der App speichern, daraufhin sollen diese Bilder dargestellt werden.
    Allerdings habe ich das Problem, dass die Bilder ungültig sind, da der View schneller ist, als der Bilddownload.

    Die Successfunktion will bei mir nicht sinnvoll funktionieren, bzw bekomme sie nicht zum laufen.
    Haben Sie eine Lösung für mich? Gerne auch per E-Mail.

    Vielen Dank im Voraus.

    P. Hafner

    • Hallo, es freut mich, dass das Plugin nützlich ist 😉


      var downloader = new Downloader();
      console.log("Start downloading " + source);

      try {
      downloader.downloadFile(
      source,
      dir.fullPath.replace(//$/,"") + "/",
      filename,
      function() {
      console.log("Finished downloading " + source);
      },
      function() {
      console.log("Error");
      }
      );
      } catch ...

      So habe ich das eingesetzt (dir ist entsprechend das Zielverzeichnis).
      Wenn das nicht funktioniert, bitte nochmal melden!

      Viele Grüße

      Alex

  4. Burkhard sagt:

    Hi,
    also falls das Thema hier nicht schon durch ist – bei mir geht das einfach nicht. Meine letzten Versuche sind mit PhoneGap 1.5 und jQuery unter iOS.
    Wenn ich (fast) das Beispiel aus der PhoneGap-Doc hernehme, in die url ein pdf-Dokument auf dem Server (steht in Whitelist, kann ich mit zB ChildBrowser auch anzeigen) und in filePath nichts oder fileSystem.root.name (entspricht Documents?) eintrage, sagt das Übertragungs-Log zwar success, aber es ist keine Datei angekommen.
    Was kann man denn bei den paar Zeilen Code falsch machen??
    Hast du vielleicht ein Beispiel, aus dem ersichtlich ist, was genau in den Variablen url und filePath drinstehen muss – vielleicht habe ich ja nur ein Syntaxproblem..
    Vielen Dank für deine Hilfe!

  5. Burkhard sagt:

    Hi Alex,
    also das Problem hab ich auch mit PhoneGap 1.3 oder 1.4..
    Ja Code, probiert habe ich das zunächst ganz einfach so:

    function onDeviceReady() {
    ..
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onFileSystemSuccess, fail);
    }

    function onFileSystemSuccess(fileSystem) {
    var fileTransfer = new FileTransfer();
    fileTransfer.download(
    „http://www.xyz.pdf“,
    fileSystem.root.name,
    function (entry) { console.log(..) },
    function (error) { console.log(..) }
    );
    }

    function fail(evt) { console.log(..) }

    Da kann man doch eigentlich gar nichts falsch machen?
    Statt fileSystem.root.name habe ich da schon alles mögliche reingeschrieben, es kommt ein Fehler oder Erfolg, aber in beiden Fällen keine Datei..
    Die Funktion onFileSystemSuccess braucht es dabei ja nicht unbedingt, wenn alles in onDeviceReady stünde – geht aber auch nicht :(.
    Danke nochmal!

    • Alex sagt:

      Hallo Burkhard,

      also wenn so etwas nicht funktioniert, dann hat es meist was mit den Dateipfaden zu tun. Das habe ich selbst oft genug gehabt 🙂

      Hier mal ein funktionierendes Beispiel, welches einfach in eine index.html gepackt werden kann, wo auf das „deviceready“ Event gelauscht wird:


      function onDeviceReady()
      {
      console.log("onDeviceReady");

      window.requestFileSystem(
      LocalFileSystem.PERSISTENT,
      0,
      function(fileSystem) {
      console.log("fileSystem root path: " + fileSystem.root.fullPath);
      var url = "http://www.aflx.de/aflx/img/aflx_logo_109x80.png";

      var filePath = fileSystem.root.fullPath+ "/test.png";
      var fileTransfer = new FileTransfer();
      fileTransfer.download(
      url,
      filePath,
      function(entry) {
      console.log("download complete: " + entry.fullPath);
      },
      function(error) {
      console.log("download error source " + error.source);
      console.log("download error target " + error.target);
      console.log("download error code " + error.code);
      });

      },
      function(error) {
      console.log("fileSystem error");
      }
      );
      }

      Viele Grüße

      Alex

  6. Michiel sagt:

    Hello Alex,

    Forgive me for writing in English. I understand German well, but my writing skills are a bit rusty.

    First of: thanks for submitting the plugin to the public domain!

    I’m trying to implement your plugin. I think I’m managing to download a file, but I’m stuck on actually saving a file to the device.

    This statement is where it goes wrong, and which ultimately returns the errors:

    BOOL response = [data writeToFile:filePath options:NSDataWritingFileProtectionNone error:&error];

    The response returns NO, which triggers the downloadFail

    Any idea what this could be? Where could I start debugging? Any help would be greatly appreciated!

    Thanks in advance! Michiel

  7. Burkhard sagt:

    Hi Alex,
    das klappt jetzt alles wunderbar.

    Auf die Sache mit dem fileSystem.root.fullPath bin ich in dem Zusammenhang nicht gekommen und so irgendwo an der Syntax gescheitert. Leider sind da manchmal die Beispiele etwas dünn..

    Also nochmals vielen Dank!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.