Подтвердить что ты не робот

Загружать blobs локально с помощью Safari

Я пытаюсь найти кросс-браузерный способ хранения данных локально в HTML5. Я создал фрагмент данных в Blob (см. MDN). Теперь я хочу переместить этот Blob в фактическую файловую систему и сохранить ее локально. Я нашел следующие способы достижения этого:

  • Используйте атрибут <a download>. Это работает только сейчас в Chrome.
  • Microsoft вводит функцию saveAs в IE 10, которая будет достигать этого.
  • Откройте URL-адрес Blob в браузере и сохраните его таким образом.

Ничего из них, похоже, не работает в Safari. Хотя (1) работает в Chrome, (2) в IE и (3) в Firefox, никто не работает в Safari 6. Атрибут загрузки еще не реализован, и при попытке открыть blob с помощью URL Safari жалуется, что URL-адреса, начинающиеся с blob: являются недопустимыми URL-адресами.

Существует хороший script, который инкапсулирует (1) и (3) под названием FileSaver.js, но это не работает с использованием последней версии Safari.

Есть ли способ сохранить Blobs локально в режиме браузера?

4b9b3361

Ответ 2

Имя файла отстой, но это работает для меня в Safari 8:

        window.open('data:attachment/csv;charset=utf-8,' + encodeURI(csvString));

UPDATE: больше не работает в Safari 9.x

Ответ 3

Единственное решение, которое я придумал, - это сделать данные: url вместо этого. Для меня это выглядит так:

window.open("data:image/svg+xml," + encodeURIComponent(currentSVGString));

Ответ 4

Вы читали эту статью? http://updates.html5rocks.com/2012/06/Don-t-Build-Blobs-Construct-Them

Относительно http://caniuse.com/#search=blob, blobs можно использовать в сафари.

Вы должны создать сервлет, который поставляет blob через стандартный http://url, поэтому вы можете избежать использования blob: url. Просто сделайте запрос на этот URL-адрес и создайте свой блоб.

Затем вы можете сохранить его в своей файловой системе или локальном хранилище.

Ответ 5

Здесь данные представляют собой данные буфера массива, поступающие от ответа при выполнении 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);