Angular JS - запрос, чтобы получить изображение
Я хотел бы отобразить jpeg-изображение в пользовательском интерфейсе. Для этого я запрашиваю мою службу (метод GET), а затем преобразован в базу 64:
$http({
url: "...",
method: "GET",
headers: {'Content-Type': 'image/jpeg'}
}).then(function(dataImage){
var binary = '';
var responseText = dataImage.data;
var responseTextLen = dataImage.data.length;
for (var j = 0; j < responseTextLen; j+=1) {
binary += String.fromCharCode(responseText.charCodeAt(j) & 0xff)
}
base64Image = 'data:image/jpeg;base64,' + window.btoa(binary);
});
В конце мой браузер сообщает мне, что изображение повреждено или усечено.
Поэтому я попытался создать XMLHttpRequest, используя overrideMimeType ('text/plain; charset = x-user-defined'), и он работает:
var xhr_object = new XMLHttpRequest();
xhr_object.overrideMimeType('text/plain; charset=x-user-defined');
xhr_object.open('GET', '...', false);
xhr_object.send(null);
if(xhr_object.status == 200){
var responseText = xhr_object.responseText;
var responseTextLen = responseText.length;
var binary = ''
for (var j = 0; j < responseTextLen; j+=1) {
binary += String.fromCharCode(responseText.charCodeAt(j) & 0xff)
}
base64Image = 'data:image/jpeg;base64,' + window.btoa(binary);
}
В чем разница?
Ответы
Ответ 1
Теперь AngularJS уважает стандарт XHR (XMLHttpRequest), и вы можете использовать обычный angular JS $http
в сочетании с HTML FileReader.
Хитрость заключается в том, чтобы получить данные как blob, которые вы передаете читателю.
var url = 'http://'; // enter url here
$http.get(url,{responseType: "blob"}).
success(function(data, status, headers, config) {
// encode data to base 64 url
fr = new FileReader();
fr.onload = function(){
// this variable holds your base64 image data URI (string)
// use readAsBinary() or readAsBinaryString() below to obtain other data types
console.log( fr.result );
};
fr.readAsDataURL(data);
}).
error(function(data, status, headers, config) {
alert("The url could not be loaded...\n (network error? non-valid url? server offline? etc?)");
});
Ответ 2
Я знаю, что это не ответ, поэтому я не уверен, что он даже стоит опубликовать. Это похоже на то, что вы делаете, но в обратном направлении! Но здесь идет:
Я отправляю строку данных изображения из элемента canvas (canvas.toDataURL( "image/png" )) на сервер (node + express), сохраняя его как png на сервере, а затем обслуживая это изображение как URL-адрес стороннего API.
Здесь исходный XMLHttpRequest, который у меня был в контроллере angular.js:
var dataURL = encodeURIComponent(canvas.toDataURL("image/png"));
var url = "/camera/" + name + "/";
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = response;
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send("image=" + dataURL);
Здесь он преобразуется в службу angular.js $http:
var dataURL = encodeURIComponent(canvas.toDataURL("image/png"));
var url = "/camera/" + name + "/";
var config = {
method: 'POST',
url: url,
data: $.param({ image: dataURL }),
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
};
$http(config);
выразить функцию для сохранения изображения на сервере:
app.post('/camera/:username', function (req) {
var username = req.params.username,
image = decodeURIComponent(req.body.image),
binaryData;
var base64Data = image.replace(/^data:image\/png;base64,/, "");
base64Data += base64Data.replace('+', ' ');
binaryData = new Buffer(base64Data, 'base64').toString('binary');
fs.writeFile("public/camera-images/" + username + ".png", binaryData, "binary");
});