2017-04-18 6 views
1

In meiner Ionic 2 Anwendung mache ich ein Bild mit cordova-plugin-camera, wo ich das Bild durch FILE_URL (lokales Gerät Bildort) abrufen, die gut funktioniert.FileTransfer gibt Fehler mit allen Eigenschaften `null` zurück

Das gibt mir die URL wie so, wenn ein Bild mit der Kamera unter: file:///storage/emulated/0/Android/....../1234.jpg

Und so, wenn ein Bild aus der Galerie auswählen: content://com.android.providers.media.documents/document/image%232312

Jetzt versuche ich, um dieses Bild zu laden mit cordova-plugin-file-transfer.

Meine Upload-Funktion ist wie folgt:

upload(){ 
    let options: FileUploadOptions = { 
     fileKey: 'file', 
     fileName: 'my_image.jpg', 
     headers: {'X-CSRF-Token': localStorage.getItem('u:token')} 
    } 
    alert(this.imageSrc); 
    this.fileTransfer.upload(this.imageSrc, encodeURI(this.API_URL), options, true) 
     .then(data => { 
      alert("d:"+JSON.stringify(data)); 
     }, err => { 
      alert("E:"+JSON.stringify(err)); 
     }); 
} 

Aber ich erhalte eine Fehler Objekt die folgende

{ 
    "code" : "null", 
    "source" : "null", 
    "target" : "null", 
    "http_status" : "null", 
    "body" : "null", 
    "exception" : "null" 
} 

gehalten wird Anmerkung: keine zusätzlichen erros throwm

+0

sind Sie sicher, dass es nicht ein serverseitige Problem ist? –

+0

@suraj Ich würde einen 'http_status' von Wert' 500' erwarten, wenn das der Fall wäre, oder sogar '404' wenn es nicht da ist – Ivaro18

+0

true .. aber sowas wie ein Cors-Problem gibt dir null/0 Status –

Antwort

0

In Ordnung, so das Problem war, dass die Galerie eine contentURI aber keine 10, die von der FileTransfer benötigt wird, zurückgegeben. Das Problem trat sowohl bei content: als auch bei /storage/ URIs auf.

Ich habe eine schlechte Praxis Workaround, aber da es immer noch nicht behoben ist, werde ich es teilen.

Ich habe es durch Hinzufügen der FilePath (cordova-plugin-filepath) behoben.

Die untere Funktion verwendet die Speicher- und Inhalts-URIs und konvertiert sie in einen Dateipfad.

(Bildquelle global in meinem Fall)

convertIfAndroidGalleryImage() { 
     // android bug, sometimes returns an image starting with content: or /storage/ which won't upload. 
     // Convert to a filepath. 
     if(this.imageSrc.startsWith('content') || this.imageSrc.startsWith('/storage/')) { 
      if(this.imageSrc.startsWith('/storage/')) { 
       this.imageSrc = 'file://'+this.imageSrc; 
      } 
      this.filePath.resolveNativePath(this.imageSrc).then(filePath => { 
       this.imageSrc = filePath; 

      }).catch(err => { console.log("error occurred"); }); 
     } 
    } 
+0

zusätzliche Info: Normalerweise konvertiere ich meine FileURI zu Base64 basierend auf der Größe des Uploads. – Ivaro18

+0

Ich machte alle Dinge. Ich verschwendete viel Zeit, warum ich überhaupt mit diesem Problem konfrontiert bin. Ich habe es gerade auf meiner App ohne --livereload versucht und es funktioniert wie ein Charme, also nicht dieses Plugin mit --Livereload ausführen. Führen Sie es auf einem echten Gerät aus. –

1

werden Bearbeiten:

Wo ich dieses Plugin in der Vergangenheit verwendet haben würde ich normalerweise in einem Pass:

file:///Path/To/File/ 

Oder so etwas wie:

cdvfile://localhost/persistent/path/to/file.txt 

Sie auch in einem Daten URI wie dies passieren kann:

data:image/jpg;base64,iVBORw0KGgoAAA.... 

Ich sehe, Sie verwenden das Kamera-Plugin haben Sie versucht, die Kamera-Optionen, um eine Daten-URL zurückgeben und das Senden, dass?

navigator.camera.getPicture(onSuccess, onFail, 
{ 
    destinationType: Camera.DestinationType.DATA_URL; 
}); 

Original-

Versuchen Sie, Ihre Optionen wie diese Konstruktion:

var options = new FileUploadOptions(); 

options.fileKey = 'file', 
options.fileName = 'my_image.jpg', 
options.headers = {'X-CSRF-Token': localStorage.getItem('u:token')} 

Dann versuchen wie diese Hochladen:

var ft = new FileTransfer(); 

ft.upload('file_url', 'endpoint_url', success_callback, fail_callback, options); 
+0

2 Probleme hier, 1: ''FileUploadOptions' bezieht sich nur auf einen Typ, wird aber hier als Wert verwendet 'und 2: Es gibt keine Unterstützung für die Rückrufe. (Ionic modifiziert das Cordova-Plugin ich denke: https://ionicframework.com/docs/native/transfer/) – Ivaro18

+0

Danke für den Link. Hatte das vorher nicht gesehen. –

+0

Nur eine kurze Frage, seit ich dein Cordova-Tag als eines deiner besten gesehen habe. Benutze ich den 'imageSrc' richtig? Oder sollte ich das ändern? (wie 'content: ///' oder 'file: ///' oder sollte es auf etwas anderes gesetzt werden) (habe ein Problem atm, dass serverside ein Null-Objekt erhält) – Ivaro18

0

ich das gleiche Problem konfrontiert, wenn ich App testen in ionischer Sicht, aber nachdem ich Apk das Problem Disa angezeigt und kein Fehler ausgelöst.