2014-04-11 7 views
19

Ich möchte das angeforderte Bild von meiner REST-API in base64-Zeichenfolge analysieren.Wie in Base64 Zeichenfolge das binäre Bild aus Antwort analysieren?

enter image description here

Erstens ... Ich dachte, es wäre leicht, nur window.btoa() Funktion für diesen Zweck zu verwenden.

Wenn ich versuche, es in einem solchen Teil meiner Anwendung zu tun:

.done(function(response, position) { 
    var texture = new Image(); 
    texture.src = "data:image/png;base64," + window.btoa(response); 

ich den nächsten Fehler haben: Uncaught InvalidCharacterError: Fehler ‚btoa‘ auf ‚Fenster‘ auszuführen: Die Zeichenfolge codiert sein, enthält Zeichen außerhalb des Latin1-Bereichs.

Wie ich hier lesen: javascript atob returning 'String contains an invalid character'

Das Problem tritt auf, weil die newlines in the response und deshalb window.btoa() gescheitert. Jedes binäre Bildformat wird natürlich Zeilenumbrüche haben ... Aber wie von dem Link oben war der Vorschlag, diese Zeichen zu entfernen/ersetzen - ist ein schlechter Vorschlag für mich, denn wenn einige Zeichen aus dem binären Bild zu entfernen/ersetzen wird es einfach beschädigt sein.

Natürlich beziehen sich die möglichen Alternativen zu dem API-Design: - eine Funktion hinzuzufügen, die Base64-Darstellung zurückkehren - eine Funktion hinzuzufügen, die URL zum Bild zurückkehren

Wenn ich nicht reparieren Ich werde die Base64-Darstellung vom Server zurückgeben, aber ich mag das nicht.

Gibt es einen Weg, um mein Problem mit der Handhabung von Binärbild aus der Antwort zu lösen, wie es oben im Teil des Screenshots gezeigt wird, nicht wahr?

+0

Was verwenden Sie API Seite? – FabianCook

+0

@FabianCook Wo genau? Wo habe ich vorgeschlagen, API für die Rückgabe von Base64/URL oder wo? Wenn du mich sorgfältig gelesen hast, möchte ich einen Weg finden, es nicht zu benutzen und zu versuchen, einen anderen Weg/Trick zu benutzen. Base64 Antwort von der Server-Seite zu machen - kein Problem, aber ich habe den Wunsch, so zu finden, um es als ein Binärbild zu behandeln. –

+0

Ahh okay. Wird sich umsehen. Halten. – FabianCook

Antwort

-3

Base 64 Bilddaten werden für mich gearbeitet wie

<img src="data:image/png;base64,' + responce + '" />

+0

Ungültige Zeichen sollten dies stoppen. Das ist was er fragt. – FabianCook

+0

Es ist für das WebGL-Projekt, nicht nur als statisches Bild und wieder "ungültige Zeichen" ... –

1

Im Erraten escape auf der Zeichenfolge zu verwenden, bevor Sie es an die Funktion übergeben, ohne den API-Aufruf ich mich nicht testen kann.

Test

encodeURI("testñ$☺PNW¢=") 

kehrt

"test%C3%B1$%E2%98%BAPNW%C2%A2=" 

Es entkommt nur alle Zeichen, sollte es alle illegalen Zeichen in der Zeichenfolge

Test

encodeURI("¶!┼Æê‼_ðÄÄ┘Ì+\+,o▬MBc§yþó÷ö") 

retur entkommen

ns
"%C2%B6!%E2%94%BC%C3%86%C3%AA%E2%80%BC_%C3%B0%C3%84%C3%84%E2%94%98%C3%8C++,o%E2%96%ACMBc%C2%A7y%C3%BE%C3%B3%C3%B7%C3%B6" 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI

+0

Ich fürchte, Flucht wird das Bild korrumpieren, so kann es nicht angezeigt werden, nachdem einige Zeichen entkommen sind, weil einige Zeilenumbrüche und binäre Zeichen für die korrekte Bildshow erforderlich sind, aber danke für Hilfe und Zeit für mich zu verbringen. –

+0

Ich würde vorschlagen, diese Feature-Anfrage zu bekommen. – FabianCook

0

Das Problem, das Sie stoßen sind, ist, dass die Reaktion in Betracht gezogen wird, um einen Unicode-String.Siehe den Abschnitt über Unicode-Strings hier: window.btoa

Mehrere Lösungen werden in diesem post angeboten

+1

die Antwort ist ein Binärformat, nicht ein Text (so kann es nicht die Unicode-Zeichenfolge sein, wie ich denke), wenn Sie genau hinschauen, habe ich den binären Inhalt von PNG-Bild –

+0

@GeloVolro gefangen - ich habe das gesehen . Ich habe einige Suchen durchgeführt, als ich den gleichen Fehler mit btoa bekam. Ich bin mir nicht sicher, ob Chrome Objekte mit Anführungszeichen um sie herum anzeigt, aber wenn man bedenkt, dass sie die Daten anzeigen, denke ich, dass es sich um eine Zeichenfolge handelt. Da es so aussieht, als würden Sie jQuery verwenden, könnten Sie den Typ jQuery.type (response) verwenden. – HungryBeagle

14

denke ich, ein Teil des Problems ist, den Sie treffen, dass jQuery.ajax nicht not nativ XHR2 Blob/Arraybuffer-Typen unterstützen, die gut umgehen kann Binärdaten (siehe Reading binary files using jQuery.ajax).

Wenn Sie ein natives XHR-Objekt mit xhr.responseType = 'arraybuffer' verwenden, dann lesen Sie das Antwort-Array und konvertieren Sie es in Base64, Sie bekommen, was Sie wollen.

Hier ist eine Lösung, die funktioniert für mich:

// http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/ 
 
function fetchBlob(uri, callback) { 
 
    var xhr = new XMLHttpRequest(); 
 
    xhr.open('GET', uri, true); 
 
    xhr.responseType = 'arraybuffer'; 
 

 
    xhr.onload = function(e) { 
 
    if (this.status == 200) { 
 
     var blob = this.response; 
 
     if (callback) { 
 
     callback(blob); 
 
     } 
 
    } 
 
    }; 
 
    xhr.send(); 
 
}; 
 

 
fetchBlob('https://i.imgur.com/uUGeiSFb.jpg', function(blob) { 
 
    // Array buffer to Base64: 
 
    var str = btoa(String.fromCharCode.apply(null, new Uint8Array(blob))); 
 

 
    console.log(str); 
 
    // Or: '<img src="data:image/jpeg;base64,' + str + '">' 
 
});

https://jsfiddle.net/oy1pk8r3/2/

Produziert Base64-codierte Ausgabe der Konsole: /9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAIBAQIBAQICAgICAgICAw.....

+1

Danke, es dauerte eine Weile bis ich erkannte, dass dies mein Problem wegen eines Tippfehlers löste, aber das funktionierte für mich. – olleicua

+1

Arbeitete für mich, vielen Dank für die Freigabe –

+1

Vielen Dank, es gerettet unseren Tag ... Cheeers ... –

3

statt mit _arrayBufferToBase64 durch den Klecks Looping (), verwenden apply() um die Konvertierung zu tun, es 30-mal schneller in meinem Browser und ist prägnanter

// http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/ 
 
function fetchBlob(uri, callback) { 
 
    var xhr = new XMLHttpRequest(); 
 
    xhr.open('GET', uri, true); 
 
    xhr.responseType = 'arraybuffer'; 
 

 
    xhr.onload = function(e) { 
 
    if (this.status == 200) { 
 
     var blob = this.response; 
 
     if (callback) { 
 
     callback(blob); 
 
     } 
 
    } 
 
    }; 
 
    xhr.send(); 
 
}; 
 

 
fetchBlob('https://i.imgur.com/uUGeiSFb.jpg', function(blob) { 
 
    var str = String.fromCharCode.apply(null, new Uint8Array(blob)); 
 
    console.log(str); 
 
    // the base64 data: image is then 
 
    // '<img src="data:image/jpeg;base64,' + btoa(str) + '" />' \t 
 
});

+0

Ich habe dies in die obige Antwort aufgenommen. – fotinakis