2013-10-09 8 views

Antwort

21

Bei dem Versuch, FileTransfer() zu verwenden, um Bilder von einem auf Android zu einem Remote-Server-Code 3 Upload auf jeder zweiten Datei i wurde immer ein Fehler phonegap App hochladen.

Es funktionierte einmal, aber sofort, wenn ich es erneut versuchte, würde es einen Fehler werfen, ohne sogar die Datei an den Server zu senden.

Der Code i für die Datei-Upload bin mit war:

Der Schlüssel zu ihm Arbeit eine Header Option hinzuzufügen war.

options.headers = { 
     Connection: "close" 
    } 
    options.chunkedMode = false; 


Der vollständige Code:

var options = new FileUploadOptions(); 

         options.fileKey="file"; 
         options.fileName=imageURI.substr(imageURI.lastIndexOf('/')+1); 
         options.mimeType="image/jpeg"; 
         options.chunkedMode = false; 
         *options.headers = { 
          Connection: "close" 
         };* 

         // setup parameters 
         var params = {}; 
         params.fullpath =imageURI; 
         params.name = options.fileName; 



         var ft = new FileTransfer(); 

         ft.upload(imageURI, encodeURI(url+'/account/profile-pics'), win, fail, options); 


function win(r) { 
        //file uploaded successfully 
       } 
      function fail(error) { 


       alert("An error has occurred: Code = " + error.code); 
       alert("upload error source " + error.source); 
       alert("upload error target " + error.target); 
      } 
+0

Dies ist extrem frustrierend, dass dies nicht durch Phonegap dokumentiert wird. Ihre Lösung hat für mich funktioniert, danke. –

+1

Ich bekam diesen Fehler (Fehlercode 3), weil die Dateigröße, die auf dem PHP-Modul auf dem Apache-Server konfiguriert wurde, geringer war als die, die ich als Teil der Anfrage posten wollte. Sobald ich das Limit erhöht hatte, wurde es für mich behoben. –

+1

Fehlercode 3 tritt auch auf, wenn das Internet getrennt wird. –

0

Fehlercode 3 ist ein ziemlich breiter Fehler; Es bedeutet im Grunde, dass Ihr Server nicht korrekt codiert ist oder Sie keine Internetverbindung haben, was zu einem Verbindungsfehler führt.

Könnte bedeuten:

  1. Sie auf dem Server installiert keine Multipart-Plugin haben. In PHP setzen Sie "file_uploads = On" (in PHP.ini), in ExpressJS benötigen Sie das Middleware-Plugin von Multer (https://www.npmjs.com/package/multer) usw.
  2. Der Dateiupload ist größer als das, was Ihr Server zulässt - was zu einem Statusfehler führt Code 413, mit einer Nachricht von "Request Entity ist zu groß". Um dies auf PHP zu beheben, müssen Sie die Einstellung upload_max_filesize in php.ini anpassen, um dies auf ExpressJS zu beheben, müssen Sie das Feld limit für Multer usw. anpassen. Grundsätzlich erhöhen Sie die Dateigröße auf dem Server. Die meisten Server beschränken die Dateiuploadgrößen als Sicherheitsmaßnahme. (https://www.owasp.org/index.php/Unrestricted_File_Upload)
  3. Der options.fileKey Wert (d. H. <input type="file" name="fileKey" />) ist nicht der Name, den Ihr Server erwartet - eine Beispielfehlermeldung könnte "unerwartetes Feld" sein.
  4. Das Feld content-type in der Kopfzeile hat keinen Wert multipart/form-data; boundary=----WebKitFormBoundary. Durch das Protokollieren des Anforderungsheaders auf dem Server kann überprüft werden, ob der Inhaltstyp korrekt festgelegt wurde.

Foto-Upload mit File Transfer

@AugieGardner - Auch in Übereinstimmung, dass die Cordova File Transfer-Plugin nicht gut für das Hochladen von Fotos mit der Kamera-Plugin genommen dokumentiert.

Zum Glück habe ich ein funktionierendes Beispiel für iOS (und meine Vermutung ist, Android als auch):
cordova file transfer plugin not working in ios simulator

Foto-Upload ohne File Transfer

Eine einfachere Alternative (oder Rückfall), wäre zu kodiere das Bild als Base64 und sende es durch eine einfache alte AJAX POST-Anfrage. Was beinhaltet die folgenden Vor- und Nachteile.

Nachteile von Base64 codierten Bilder über AJAX gesendet

  1. Sie müssen möglicherweise die Anfrage Limit Größe auf dem Server erhöhen, so dass Sie nicht 413 Fehler (zB „Anforderungsentität zu groß“) erhalten Sie .
  2. Base64-Bilder sind etwa 37% größer als Binärbilder, was wahrscheinlich zu langsameren Uploads führt.
  3. Möglicherweise nicht für Videos oder andere Dateitypen geeignet.

Vorteile von Base64 codiert über AJAX

  1. Kleinere App Größe gesendet Bilder (und schnellere Download-app), weil File Transfer Plugins Cordova und möglicherweise Datei-Plugins Cordova wird nicht fügen Sie Overhead zur App hinzu.
  2. Sie müssen File Transfer Plugin Fehler nicht beheben, wie Sie Ihre App auf neue Betriebssysteme skalieren (z. B. iOS, Android, etc).
  3. Sie benötigen möglicherweise keinen Multipart-Service (oder Middleware) auf dem Server, um Bilder hochzuladen.
Verwandte Themen