2012-12-10 8 views

Odpowiedz

4

Jeśli kodowanie znaków w XMLHttpRequest został ustawiony na something that won't change the binary data lub masz set the response type można następnie uruchomić .responseText przez btoa (wprowadzenie jej w base64 i pozwalając przypisać go jako danych URI) lub uzyskaj dostęp do danych binarnych odpowiednio .response.


Zakładając, że wystąpienie o nazwie xhr i używasz metody charset przed xhr.send ale po xhr.open zrobić

xhr.overrideMimeType("text/plain; charset=x-user-defined"); 

wtedy, gdy jesteś 200 OK

var dataURI = 'data:image/jpeg;base64,' + btoa(xhr.responseText); 

których można następnie ustawić jako src z .


znów zakładając xhr, tym razem .response sposób; między .open i .send,

xhr.responseType = "arraybuffer"; 

Następnie na 200 OK

var arrayBufferView = new Uint8Array(xhr.response), // can choose 8, 16 or 32 depending on how you save your images 
    blob = new Blob([arrayBufferView], {'type': 'image\/jpeg'}), 
    objectURL = window.URL.createObjectURL(blob); 

które można ustawić jako src wystąpienia <img>. Example

+0

Nazywa się to obrazem śródliniowym. Zauważ, że IE8 obsługuje tylko obrazy śródliniowe, które mają mniej niż 32 KB (dla danych kodowanych base64, więc obraz źródłowy musiałby mieć mniej niż 24 KB), a IE7 i wcześniejsze nie obsługują w ogóle obrazów wbudowanych (jeśli to ma znaczenie). –

+0

Próbowałem tego, ale 'btoa (xhr.responseText)' powraca "Błąd: INVALID_CHARACTER_ERR: DOM Exception 5". Nie mogę znaleźć powodu, dlaczego tak się dzieje. Dla IE7/IE8 ... będę musiał zrobić obiekt Flash, aby sobie z nim poradzić grrr – Marc

+0

@Marc, co dzieje się, ponieważ 'btoa' ma kilka [błędów] (https://bugzilla.mozilla.org/show_bug.cgi? id = 213047) (to samo dotyczy sieci Web), zaktualizuję odpowiedź metodą _ArrayBuffer_ -> 'Blob' -> _URL.createObjectURL_, która moim zdaniem jest nieco lepsza niż przez _FileReader_, ale nadal nie jest tak miła jako _btoa_. –