Вот два значения, которые я использую, чтобы помочь с поддержкой на .toBlob()
, он менее эффективен, однако он выполняет свою работу.
Этот метод принимает в строке base64, типа (IE: image/png)
содержания и обратный вызов, когда капля была построена с использованием atob()
var b64_to_blob = function(b64_data, content_type, callback) {
content_type = content_type || '';
var slice_size = 512;
var byte_characters = atob(b64_data);
var byte_arrays = [];
for(var offset = 0; offset < byte_characters.length; offset += slice_size) {
var slice = byte_characters.slice(offset, offset + slice_size);
var byte_numbers = new Array(slice.length);
for(var i = 0; i < slice.length; i++) {
byte_numbers[i] = slice.charCodeAt(i);
}
var byte_array = new Uint8Array(byte_numbers);
byte_arrays.push(byte_array);
}
var blob = new Blob(byte_arrays, {type: content_type});
callback(blob);
};
Я использую этот метод, чтобы получить значение base64 прямого звено при необходимости , В моем случае это, чтобы загрузить фотографию пользователей Facebook, когда они регистрируются в моем приложении.
var image_link_to_b64 = function(url, content_type, callback) {
var image = new Image();
image.crossOrigin = 'Anonymous';
image.onload = function() {
var canvas = document.createElement('CANVAS');
var context = canvas.getContext('2d');
var data_url;
canvas.height = this.height;
canvas.width = this.width;
context.drawImage(this, 0, 0);
data_url = canvas.toDataURL(content_type);
data_url = data_url.substr(22);
callback(data_url);
canvas = null;
};
image.src = url;
};
Ниже, как она выглядит при добавлении информации в firebase системой хранения
$fileService.image_link_to_b64(facebook_info.photoURL + '?width=512&height=512', 'image/png', function(b64) {
$fileService.b64_to_blob(b64, 'image/png', function(blob) {
$fileService.upload_user_photo(blob, 'image/png', function(url) {
// Firebase storage download url here
}
}
}
Incase вам интересно, upload_user_photo просто загружать в firebase хранения:
var upload_user_photo = function(data, blob, callback) {
var upload_task = user_photo_reference.child('user_photo').put(data);
upload_task.on('state_changed', function(snapshot) {
}, function(error) {
alert('error: ', error);
}, function() {
callback(upload_task.snapshot.downloadURL);
});
};]
Для IE9 посмотреть polyfill : https://github.com/eligrey/Blob.js/blob/master/Blob.js
Мне жаль, что я не могу использовать .toBlob, но он не поддерживается вообще Safari или IE <10. IE9 также не поддерживается полиполнением. –
Вы также можете преобразовать b64 в blob вручную, см. Мой ответ. – Hobbyist