Как вернуть изображение из $http.get в AngularJS
В моем контроллере я вызываю службу, которая возвращает обещание
var onComplete = function(data) {
$scope.myImage = data;
};
В моей службе я делаю звонок, чтобы получить изображение, передав url непосредственно самому изображению:
return $http.get("http://someurl.com/someimagepath")
.then(function(response){
return response.data;
});
Все вызовы преуспевают, и данные response.data хранятся внутри изображения внутри:
����JFIF��;CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), quality = 90
��C
��C
����"��
���}!1AQa"q2���#B��R��$
хотя я не уверен, действительно ли это происходит, потому что у меня возникают проблемы с его отображением. Я пробовал (внутри index.html)
<img ng-src="{{myImage}}">
and
<img ng-src="{{myImage}}.jpeg">
and
<img ng-src="data:image/JPEG;base64,{{myImage}}">
Идеи?
Можно ли вернуть реальное изображение из $http.get и преобразовать его ответ обратно в изображение (jpeg и т.д.).
Спасибо!
Ответы
Ответ 1
Возвращаемое изображение находится в двоичном кодировании, а не Base64.
Понятно, что теги <img>
не поддерживают поиск из двоичных атрибутов, поэтому вам придется искать другое решение.
Вы можете попробовать преобразовать двоичную кодировку в Base64 на стороне клиента, используя TypedArrays вместе с btoa
. Тогда вы сможете использовать
<img ng-src="data:image/JPEG;base64,{{myImage}}">
Это руководство по Mozilla покрывает запрос XHR и изображение и считывает его непосредственно в UInt8Array
. Это должно быть хорошим стартовым местом.
Он написан для простого старого Javascript, но перевод его на Angular должен быть хорошим упражнением, если вы просто изучаете веревки.
Ответ 2
Ни один из методов не кажется полным, это полное решение:
$http({
method: 'GET',
url: imageUrl,
responseType: 'arraybuffer'
}).then(function(response) {
console.log(response);
var str = _arrayBufferToBase64(response.data);
console.log(str);
// str is base64 encoded.
}, function(response) {
console.error('error in getting static img.');
});
function _arrayBufferToBase64(buffer) {
var binary = '';
var bytes = new Uint8Array(buffer);
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
}
Тогда я могу использовать его напрямую:
<img data-ng-src="data:image/png;base64,{{img}}">
Функция преобразования arraybuffer в base64 напрямую берется из ArrayBuffer в кодировку base64
Ответ 3
На всякий случай кому-то это нужно.
В моем случае мне пришлось отправить запрос через службу angular $http
из-за различных трансформаторов и других причудливых вещей, которые мы делаем с ним.
Итак, на основе руководства Mozilla, упомянутого ранее, я придумал следующее решение:
let getImageDataURL = (url, imageType = 'image/jpeg') => {
return $http.get(url, {responseType: 'arraybuffer'}).then((res) => {
let blob = new Blob([res.data], {type: imageType});
return (window.URL || window.webkitURL).createObjectURL(blob);
});
};
Основная идея - установить свойство responseType
базового запроса XHR и преобразовать двоичный контент в URL-адрес данных.