Совместимость браузера конструктора Blob
Я разрабатываю приложение, в котором я получаю данные изображения, хранящиеся в uint8Array.
Затем я преобразую эти данные в Blob, а затем создаю URL-адрес изображения.
Упрощенный код для получения данных с сервера:
var array;
var req = new XMLHttpRequest();
var url = "img/" + uuid + "_" +segmentNumber+".jpg";
req.open("GET", url, true);
req.responseType = "arraybuffer";
req.onload = function(oEvent) {
var data = req.response;
array = new Int8Array(data);
};
Конструктор:
out = new Blob([data], {type : datatype} );
Контрулятор Blob вызывает проблему. Он отлично работает во всех браузерах, кроме Chrome, на мобильных и настольных устройствах.
Использование Blob:
// Receive Uint8Array using AJAX here
// array = ...
// Create BLOB
var jpeg = new Blob( [array.buffer], {type : "image/jpeg"});
var url = DOMURL.createObjectURL(jpeg);
img.src = url;
Настольный Chrome дает мне предупреждение: ArrayBuffer values are deprecated in Blob Constructor. Use ArrayBufferView instead.
Мобильный Chrome дает мне ошибку: illegal constructor
Если я изменяю конструктор для работы с Chrome, он не работает в других браузерах.
Ответы
Ответ 1
Получил его работу с вашим кодом. Мне нужно было лишь немного изменить детали:
if(e.name == 'TypeError' && window.BlobBuilder){
var bb = new BlobBuilder();
bb.append(data);
out = bb.getBlob(datatype);
console.debug("case 2");
}
bb.append(данные);//данные должны быть без скобок
Моя функция (конструктор), которая теперь работает для всех браузеров:
var NewBlob = function(data, datatype)
{
var out;
try {
out = new Blob([data], {type: datatype});
console.debug("case 1");
}
catch (e) {
window.BlobBuilder = window.BlobBuilder ||
window.WebKitBlobBuilder ||
window.MozBlobBuilder ||
window.MSBlobBuilder;
if (e.name == 'TypeError' && window.BlobBuilder) {
var bb = new BlobBuilder();
bb.append(data);
out = bb.getBlob(datatype);
console.debug("case 2");
}
else if (e.name == "InvalidStateError") {
// InvalidStateError (tested on FF13 WinXP)
out = new Blob([data], {type: datatype});
console.debug("case 3");
}
else {
// We're screwed, blob constructor unsupported entirely
console.debug("Errore");
}
}
return out;
}
Ответ 2
Итак, на самом деле это две разные проблемы. Предупреждение Desktop Chrome было bug в chrome, которое исправлено с 2013-03-21.
Мобильный Chrome предоставляет вам TypeError, потому что конструктор blob не поддерживается. Вместо этого вы должны использовать старый API BlobBuilder. API-интерфейс BlobBuilder имеет специфические для браузера конструкторы BlobBuilder. Это относится к FF6-12, Chrome 8-19, Mobile Chrome, IE10 и Android 3.0-4.2.
var array = new Int8Array([17, -45.3]);
try{
var jpeg = new Blob( [array], {type : "image/jpeg"});
}
catch(e){
// TypeError old chrome and FF
window.BlobBuilder = window.BlobBuilder ||
window.WebKitBlobBuilder ||
window.MozBlobBuilder ||
window.MSBlobBuilder;
if(e.name == 'TypeError' && window.BlobBuilder){
var bb = new BlobBuilder();
bb.append(array.buffer);
var jpeg = bb.getBlob("image/jpeg");
}
else if(e.name == "InvalidStateError"){
// InvalidStateError (tested on FF13 WinXP)
var jpeg = new Blob( [array.buffer], {type : "image/jpeg"});
}
else{
// We're screwed, blob constructor unsupported entirely
}
}
Fiddle: http://jsfiddle.net/Jz8U3/13/