2017-12-13 2 views
0

ich eine Datei auf dem Gerät haben, die in einem Ordner wie gespeichert:Bild mit Blob erstellt enthält nur Zahlen und Kommas

/opt/share/folder/image.jpg 

Ich möchte diese Datei auf meinem Server hochzuladen mit einigen Ajax-Request nur wie ich es mit einem Standard-HTML-Formular machen würde.

Nach ein paar Suchen, ich bin gekommen, um eine Blob-Datei zu erstellen und auf den Server hochladen; das funktioniert. Aber das Problem ist, dass mein jpeg bei der Ankunft beschädigt ist und enthält einen Anzug von Zahlen und Kommas (technisch, Bytes der Quelldatei):

255,216,255,224,0,16,74,70,73,70,0,1,1,0,0,1,0,1,0,0,255,219,0,67,0,8,6,6,7,6,5,8,7,7 

Der Dateisystem-API von Tizen ermöglicht es mir, diese Datei zu öffnen und lies seine Bytes - was ich tue. So verwende ich den folgenden Code Bytes zu lesen, einen Klecks erstellen und laden Sie sie auf meinem Server:

var raw = fs.readBytes(1024);      
var blob = new Blob([raw], {type:"image/jpeg"}); 
var formData = new FormData(); 
formData.append('screenCapture', blob); 

$.ajax({ 
    type: 'post', 
    url: myurl, 
    processData: false, 
    contentType: false, 
    data: formData, 
    success: function(data){ 
      ... 

    }, 
    error: function(jqxhr, status, msg){ 
      console.log("ERROR! " + msg); 
      } 
}); 
+0

Ich glaube, Ihre Ajax-Anfrage werden die Daten als JSON Senden und nicht als binäre represantation. Sie müssen den JSON wieder in ein Binärformat auf Ihrem Server konvertieren. Sie können auch das Bild in ein Base64-Format konvertieren, bevor Sie es über die Leitung senden. Auf diese Weise können Sie sicherstellen, dass die Daten aufgrund einiger Zeichensatzkonvertierungen usw. nicht beschädigt werden. – treeno

+0

@treeno Die Daten werden als Formulardaten gesendet, was bedeutet, dass die erstellte Datei auf der Serverseite korrekt ankommt. Aber versuchen, diesen Blob als img mit blueimp loadImage Bibliothek anfügen, zeigt, dass der Blob an der Quelle nicht korrekt ist. Es scheint, dass die readBytes kein korrektes Byte-Array erstellt? – BananasSplitter

Antwort

1

ich endlich gefunden, was mit meinem Code falsch war.

In der Tat, readBytes geben ein Array der Zahl zurück, die Bytes entspricht, aber das Array ist nicht als Byte-Array formatiert.

ein neues Uint8Array aus diesem Array Erstellen hat den Trick:

var raw = fs.readBytes(1024); 
var byteArray = new Uint8Array(raw); 
var blob = new Blob([byteArray], {type:"image/jpeg"}); 
Verwandte Themen