Ответ 1
Проблема заключалась в том, что у меня были шестнадцатеричные данные, которые нужно было преобразовать в двоичные файлы до того, как они были закодированы base64.
в PHP:
base64_encode(pack("H*", $subvalue))
Я извлекаю изображение Blob из базы данных, и я хотел бы иметь возможность просматривать это изображение с помощью JavaScript. Следующий код создает значок разорванного изображения на странице:
var image = document.createElement('image');
image.src = 'data:image/bmp;base64,'+Base64.encode(blob);
document.body.appendChild(image);
Вот jsFiddle, содержащий весь необходимый код, включая BLOB-объект. Законченный код должен правильно отображать изображение.
Проблема заключалась в том, что у меня были шестнадцатеричные данные, которые нужно было преобразовать в двоичные файлы до того, как они были закодированы base64.
в PHP:
base64_encode(pack("H*", $subvalue))
Вы также можете получить объект BLOB непосредственно из XMLHttpRequest. Установка responseType в blob делает трюк. Вот мой код:
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://localhost/image.jpg");
xhr.responseType = "blob";
xhr.onload = response;
xhr.send();
И функция ответа выглядит так:
function response(e) {
var urlCreator = window.URL || window.webkitURL;
var imageUrl = urlCreator.createObjectURL(this.response);
document.querySelector("#image").src = imageUrl;
}
Нам просто нужно сделать пустой элемент изображения в HTML:
<img id="image"/>
Если вы хотите вместо этого использовать fetch:
var myImage = document.querySelector('img');
fetch('flowers.jpg').then(function(response) {
return response.blob();
}).then(function(myBlob) {
var objectURL = URL.createObjectURL(myBlob);
myImage.src = objectURL;
});
Источник:
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
В вашем примере вы должны createElement('img')
.
В вашей ссылке base64blob != Base64.encode(blob)
.
Это работает, пока ваши данные действительны http://jsfiddle.net/SXFwP/ (у меня не было BMP-образов, поэтому мне пришлось использовать PNG).
Вы можете преобразовать свою строку в Uint8Array, чтобы получить необработанные данные. Затем создайте Blob для этих данных и перейдите на URL.createObjectURL( blob), чтобы преобразовать Blob в URL-адрес, который вы передаете img.src.
var data = '424D5E070000000000003E00000028000000EF...';
// Convert the string to bytes
var bytes = new Uint8Array(data.length / 2);
for (var i = 0; i < data.length; i += 2) {
bytes[i / 2] = parseInt(data.substring(i, i + 2), /* base = */ 16);
}
// Make a Blob from the bytes
var blob = new Blob([bytes], {type: 'image/bmp'});
// Use createObjectURL to make a URL for the blob
var image = new Image();
image.src = URL.createObjectURL(blob);
document.body.appendChild(image);
Вы можете попробовать полный пример: http://jsfiddle.net/nj82y73d/
Я предполагаю, что у вас была ошибка во встроенном коде вашего изображения. Попробуйте следующее:
var image = document.createElement('img');
image.src="data:image/gif;base64,R0lGODlhDwAPAKECAAAAzMzM/////wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==";
image.width=100;
image.height=100;
image.alt="here should be some image";
document.body.appendChild(image);