Использование файлов API - BLOB Html5?
у меня есть входной файл : (jsbin)
<input type="file" accept="image/*" id="input" multiple onchange='handleFiles(this)' />
который, когда файл выбран, показывает небольшие изображения выбранного изображения:
Я могу сделать его в два варианта :
использование FileReader:
function handleFiles(t) //t=this
{
var fileList = t.files;
for (var i = 0; i < fileList.length; i++)
{
var file = fileList[i];
var img = document.createElement("img");
img.style... = ...
document.getElementById('body').appendChild(img);
var reader = new FileReader();
reader.onload = (function (aImg)
{
return function (e)
{
aImg.src = e.target.result;
};
})(img);
reader.readAsDataURL(file);
}
// ...
}
использование ObjectURL / BLOB:
function handleFiles(t)
{
var fileList = t.files;
for (var i = 0; i < fileList.length; i++)
{
var file = fileList[i];
var img = document.createElement("img");
img.src = window.URL.createObjectURL(file);
img.onload = function (e)
{
window.URL.revokeObjectURL(this.src);
}
document.getElementById('body').appendChild(img);
}
}
как вы можете видеть, оба работают :
но
результат html отличается:
вопрос :
С первым , я уже знаю, что я могу сделать , это чистые данные-URI данных.
но когда я должен использовать второй подход (blob) ?
Я имею в виду - что я могу сделать blob:http%3A//run.jsbin.com/82b29cc5-8452-4ae2-80ca-a949898f4295
?
п.С.
mdn объяснение URL.createObjectURL
не поможет мне о том, когда я должен использовать каждый.
2 ответов
длина blob:
URL всегда ниже разумного предела.
URL-адреса данных могут быть произвольно большим. Следовательно, когда URL-адрес данных слишком длинный, некоторые браузеры (т. е. кашель) больше не будет отображать изображение. Итак, если вы хотите отобразить очень большие файлы, используя blob:
(или filesystem:
URLs) может иметь больше смысла, чем Data-URLs.
кроме того, вы можете напрямую восстановить данные из blob:
URL-адресом (при условии, что blob не имеет был отозван еще, например, потому, что документ был выгружен, и та же политика происхождения не нарушена) используя XMLHttpRequest
. Например, следующий код получает содержимое URL-адреса blob в виде текста:
var blobUrl = URL.createObjectURL(new Blob(['Test'], {type: 'text/plain'}));
var x = new XMLHttpRequest();
// set x.responseType = 'blob' if you want to get a Blob object:
// x.responseType = 'blob';
x.onload = function() {
alert(x.responseText);
};
x.open('get', blobUrl);
x.send();
если вы хотите отправить содержимое файла на сервер с помощью XMLHttpRequest
, на самом деле нет смысла использовать blob:
или data:
URL-адресом. Просто отправьте File
объект непосредственно с помощью FormData
вот основные различия в том, как вы можете использовать два типа адресов:
URL-Адреса Данных:
плюсы:
- вы можете получить данные из них очень легко
- вы можете отправить их другому пользователю или через HTTP, и данные все еще там
- не имеет значения, где и как они были созданы, если данные действительны, вы увидите контент в любом браузере, на любой ОС, везде
плюсы:
- URL-адреса данных часто являются запретительно длинными, так что IE не может обрабатывать их, и это может раздражать обрабатывать в любом браузере
- они менее эффективны, чем Blob URLs (вы должны прочитать файл, чтобы создать его, вы не с BLOBs и т. д)
BLOB URLs:
плюсы:
- они намного короче, чем URL-адреса данных, что делает их намного больше легкоуправляемый
- вы можете получить доступ к своим данным, но так как URL-адрес является только непрозрачной ссылкой на данные, данные должны быть доступны с помощью
FileReader
и данные не могут быть извлечены непосредственно из URL-адреса, как в URL-адресах данных - потому что они имеют разумную длину, они легче иметь дело с и имеют лучшую поддержку IE
плюсы:
- данные недоступны в самом URL-адресе (URL-адрес является непрозрачной ссылкой), и он не сохраняется на облаках
- из-за con #1 Вы не можете отправить URL-адрес на сервер/другому пользователю, так как они не смогут получить доступ к данным. Так что URL только для вас.
- вы также не можете получить доступ к данным из URL BLOB в другом браузере (даже на том же компьютере)
- кроме того, вы не можете получить доступ к URL BLOB из другого источника, даже в том же браузере
этот список заставляет думать, что URL-адреса данных являются очевидным преимуществом, но URL-адреса BLOB создаются быстрее, и если вам не нужно отправлять url-адрес другим пользователям или серверу, вы должны использовать их, потому что они быстрее, проще в использовании, более управляемы и лучше подходят для IE. Но если вам нужно отправить url-адрес на сервер или другому пользователю, я бы рекомендовал как-то передать blob напрямую с помощью XHR2. URL-адреса данных не так уж хороши.