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
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). –
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
@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_. –