Ответ 1
FileSaver.js обновлен недавно, и он работает на IE10, Safari5 + и т.д.
Смотрите: https://github.com/eligrey/FileSaver.js/#supported-browsers
Я пытаюсь найти кросс-браузерный способ хранения данных локально в HTML5. Я создал фрагмент данных в Blob (см. MDN). Теперь я хочу переместить этот Blob в фактическую файловую систему и сохранить ее локально. Я нашел следующие способы достижения этого:
<a download>
. Это работает только сейчас в Chrome.saveAs
в IE 10, которая будет достигать этого.Ничего из них, похоже, не работает в Safari. Хотя (1) работает в Chrome, (2) в IE и (3) в Firefox, никто не работает в Safari 6. Атрибут загрузки еще не реализован, и при попытке открыть blob с помощью URL Safari жалуется, что URL-адреса, начинающиеся с blob:
являются недопустимыми URL-адресами.
Существует хороший script, который инкапсулирует (1) и (3) под названием FileSaver.js, но это не работает с использованием последней версии Safari.
Есть ли способ сохранить Blobs локально в режиме браузера?
FileSaver.js обновлен недавно, и он работает на IE10, Safari5 + и т.д.
Смотрите: https://github.com/eligrey/FileSaver.js/#supported-browsers
Имя файла отстой, но это работает для меня в Safari 8:
window.open('data:attachment/csv;charset=utf-8,' + encodeURI(csvString));
UPDATE: больше не работает в Safari 9.x
Единственное решение, которое я придумал, - это сделать данные: url вместо этого. Для меня это выглядит так:
window.open("data:image/svg+xml," + encodeURIComponent(currentSVGString));
Вы читали эту статью? http://updates.html5rocks.com/2012/06/Don-t-Build-Blobs-Construct-Them
Относительно http://caniuse.com/#search=blob, blobs можно использовать в сафари.
Вы должны создать сервлет, который поставляет blob через стандартный http://url, поэтому вы можете избежать использования blob: url. Просто сделайте запрос на этот URL-адрес и создайте свой блоб.
Затем вы можете сохранить его в своей файловой системе или локальном хранилище.
Здесь данные представляют собой данные буфера массива, поступающие от ответа при выполнении http rest call в js. Это работает в сафари, однако может возникнуть проблема с именем файла, поскольку он становится без названия.
var binary = '';
var bytes = new Uint8Array( data );
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode( bytes[ i ] );
}
var base64 = "data:"+contentType+";base64,"+window.btoa( binary );
var uri = encodeURI(base64);
var anchor = document.createElement('a');
document.body.appendChild(anchor);
anchor.href = uri;
anchor.download = fileName;
anchor.click();
document.body.removeChild(anchor);