У меня есть автономное веб-приложение, использующее кэширование приложений. Мне нужно предоставить ему около 10–20 МБ данных, которые он будет сохранять (на стороне клиента), состоящих в основном из файлов изображений PNG. Операция следующая:
- Веб-приложение загружается и устанавливается в appcache (использует манифест)
- Запросы веб-приложений из файлов данных PNG сервера (как? - альтернативные варианты см. Ниже)
- Иногда веб-приложение повторно синхронизируется с сервером и выполняет небольшие частичные обновления / удаления / добавления в базу данных PNG.
- К вашему сведению: сервер - это сервер JSON REST, который может размещать файлы в wwwroot для получения
Вот мой текущий анализ клиентских "баз данных", которые обрабатывают двоичное хранилище больших двоичных объектов.
СМОТРЕТЬ ОБНОВЛЕНИЕ внизу
AppCache (через манифест добавьте все PNG, а затем обновите по запросу)
- ПРОТИВ: любое изменение элемента базы данных PNG будет означать полную загрузку всех элементов в манифесте (действительно плохие новости!)
Веб-хранилище
- Минусы: разработан для хранения JSON.
- ПРОТИВ: может хранить капли только с помощью кодировки base64 (вероятно, фатальный недостаток из-за стоимости декодирования)
- ПРОТИВ: Жесткое ограничение в 5 МБ для веб-хранилища http://htmlui.com/blog/2011-08-23-5-obscure-facts-about-html5-localstorage.html
PhoneGap и SQLLite
- ПРОТИВ: Спонсор отклонит его как нативное приложение, требующее сертификации.
ZIP файл
- Сервер создает zip-файл, помещает его в wwwroot и уведомляет клиента.
- пользователь должен вручную разархивировать (по крайней мере, так я это вижу) и сохранить в файловой системе клиента
- Веб-приложение использует API файловой системы для ссылки на файлы
- ПРОТИВ: ZIP может быть слишком большим (zip64?), Долго создавать
- ПРОТИВ: Не уверен, что FileSystem API всегда может читать из песочницы (я так думаю)
USB или SD карты (обратно в каменный век ....)
- Пользователь будет локальным для сервера перед отключением
- Так что мы могли бы попросить его вставить SD-карту, пусть сервер заполнит ее файлами PNG.
- Затем пользователь подключит его к ноутбуку, планшету.
- Веб-приложение будет использовать API файловой системы для чтения файлов
- ПРОТИВ: Не уверен, что FileSystem API всегда может читать из песочницы (я так думаю)
WebSQL
- ПРОТИВ: w3c отказался от него (довольно плохо)
- Я мог бы рассмотреть оболочку Javascript, которая использует IndexedDB и WebSQL как запасной вариант.
FileSystem API
- Chrome поддерживает чтение / запись BLOB-объектов
- ПРОТИВ: непонятно про IE и FireFox (IE10, нестандартный msSave)
- caniuse.com сообщает о поддержке iOS и Android (но, опять же, это просто R / W JSON, или он включает полный API blob для записи?
- ПРОТИВ: ребятам FireFox не нравится FileSystem API, и они не понимают, поддерживают ли они сохранение больших двоичных объектов: https://hacks.mozilla.org/2012/07/why-no-filesystem-api-in-firefox/
- PRO: намного быстрее, чем IndexedDB для больших двоичных объектов, согласно jsperf http://jsperf.com/indexeddb-vs-localstorage/15 (стр. 2)
IndexedDB
- Хорошая поддержка в IE10, FireFox (сохранение, чтение blobs)
- Хорошая скорость и более простое управление, чем файловая система (удаление, обновление)
- PRO: см. Тесты скорости: http://jsperf.com/indexeddb-vs-localstorage/15
- См. Эту статью о хранении и отображении изображений в IndexedDB: https://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/
- ПРОТИВ: Я подтвердил, что Chrome еще не поддерживает запись больших двоичных объектов (текущая ошибка, но не ясно, когда она будет исправлена)
- ОБНОВЛЕНИЕ: сообщение в блоге от июня 2014 г. предполагает, что Chrome теперь поддерживает капли в
IndexedDB
- ОБНОВЛЕНИЕ: этот caniuse / indexeddb подтверждает: «Chrome 36 и ниже не поддерживает объекты Blob в качестве значений indexedDB.»; предлагая> Chrome36 поддерживает объекты Blob.
Оболочка LawnChair JavaScript http://brian.io/lawnchair/
- PRO: очень чистая оболочка для IndexedDB, WebSQL или любой другой базы данных, которая у вас есть (подумайте о polyfill)
- ПРОТИВ: не может хранить двоичные капли, только данные: uri (кодировка base64) (вероятно, фатальный недостаток из-за стоимости декодирования)
IndexedDB JQUERY polyFill https://github.com/axemclion/jquery-indexeddb
- Парашурам написал красивую оболочку JQUERY для необработанного интерфейса IndexedDB.
- PRO: значительно упрощает использование IndexedDB, я надеялся добавить прокладку / полифилл для Chrome FileSystemAPI
- ПРОТИВ: Он должен обрабатывать капли, но мне не удалось заставить его работать
idb.filesystem.js http://ericbidelman.tumblr.com/post/21649963613/idb-filesystem-js-bringing-the-html5-filesystem-api
- Эрик Бидельман @ Google написал хорошо протестированный PolyFill API FileSystem, который использует индексированную БД в качестве альтернативы.
- PRO: API файловой системы хорошо подходит для хранения больших двоичных объектов.
- PRO: отлично работает в FireFox и Chrome
- PRO: отлично подходит для синхронизации с облачным CouchDB
- ПРОТИВ: непонятно почему, но он не работает в IE10
Библиотека JavaScript PouchDB http://pouchdb.com/
- отлично подходит для синхронизации CouchDB с локальной БД (использует WebSQL или IndexedDB (хотя это не моя проблема)
- ПРОТИВ: НЕТ МИНУСОВ, PouchDB теперь поддерживает двоичные капли для всех последних браузеров (IE, Chrome, Firefox, Chrome на мобильных устройствах и т. Д.), А также для многих старых браузеров. Когда я впервые написал этот пост, этого не было.
ПРИМЕЧАНИЕ: чтобы увидеть кодировку data: uri для PNG, я создал пример по адресу: http://jsbin.com/ivefak/1/edit
Желаемые / полезные / ненужные функции
- Нет собственного приложения (EXE, PhoneGap, ObjectiveC и т. Д.) На клиенте (чистое веб-приложение)
- Требуется только запускать последние версии Chrome, FireFox, IE10 для ноутбуков.
- Сильно хочу такое же решение для Android-планшета (IOS тоже было бы неплохо), но для работы нужен только один браузер (FF, Chrome и т. Д.)
- Быстрое начальное заполнение БД
- ТРЕБОВАНИЕ: очень быстрое извлечение изображений веб-приложением из хранилища (БД, файла)
- Не предназначен для потребителей. Мы можем ограничить браузеры и попросить пользователя выполнить специальные настройки и задачи, но давайте минимизируем это
Реализации IndexedDB
- Есть отличная статья о том, как IE, FF и Chrome внутренне реализуют это по адресу: http://www.aaron-powell.com/web/indexeddb-storage.
- Коротко:
- IE использует тот же формат базы данных, что и Exchange и Active Directory для IndexedDB.
- Firefox использует SQLite, поэтому это своего рода реализация базы данных NoSQL в базе данных SQL.
- Chrome (и WebKit) используют хранилище ключей / значений, унаследованное от BigTable.
Мои текущие результаты
- Я решил использовать подход IndexedDB (и polyfill с FileSystemAPI для Chrome, пока они не предоставят поддержку blob)
- При извлечении плиток у меня возникла дилемма, так как ребята из JQUERY недовольны тем, чтобы добавить это в AJAX.
- Я выбрал XHR2-Lib Фила Парсонса, который очень похож на JQUERY .ajax () https://github.com/pmp/xhr2-lib
- Производительность при загрузке 100 МБ (IE10 4s, Chrome 6s, FireFox 7s).
- Мне не удалось заставить работать ни одну из оболочек IndexedDB для больших двоичных объектов (lawnchair, PouchDB, jquery-indexeddb и т. Д.)
- Я свернул свою собственную оболочку, и производительность (IE10 2s, Chrome 3s, FireFox 10s)
- С FF, я полагаю, мы видим проблему производительности при использовании реляционной БД (sqllite) для хранилища, отличного от sql.
- ПРИМЕЧАНИЕ. В Chrome есть отличные инструменты отладки (вкладка разработчика, ресурсы) для проверки состояния IndexedDB.
ОКОНЧАТЕЛЬНЫЕ результаты опубликованы ниже в качестве ответа
Обновить
PouchDB теперь поддерживает двоичные BLOB-объекты для всех последних браузеров (IE, Chrome, Firefox, Chrome на мобильных устройствах и т. Д.), А также для многих старых браузеров. Когда я впервые написал этот пост, этого не было.
источник
Ответы:
Результаты Автономный кеш BLOB-объектов для скользких карт PNG
Тестирование
Получить с веб-сервера
Место хранения
Дисплей
Полученные результаты
источник
Для ваших требований я предлагаю разработать новый полифилл на основе двух других: API файловой системы для IndexedDB и IndexedDB для WebSQL - лучший вариант.
Первый обеспечит поддержку хранения больших двоичных объектов в Chrome (FileSystem API) и Firefox (IndexedDB), а второй должен обеспечивать поддержку Android и iOS ( WebSQL ). Что нужно, так это заставить эти полифиллы работать вместе, и я полагаю, что это несложно.
NB: Поскольку я не смог найти никакой информации об этом в Интернете, вам следует проверить, будет ли хранение больших двоичных объектов с помощью полифилла WebSQL работать на iOS и Android. Похоже, это должно работать:
Источник
источник
У меня есть примеры кэширования карт (открытый пример, обнаружение регионов и масштабирование, переключение в автономный режим, и обнаруженные регионы будут доступны).
Есть
map.js
- слой карты для автономных тайлов,storage.js
- реализация хранилища на основе IndexedDb и WebSQL (но это всего лишь тестовая реализация с плохой производительностью).Дополнительная информация о размерах 2-х миллиардного города ( Минск ):
источник
PNG
с проекционными по умолчанию (EGPS: 3857) , но независимо от того ,JPEG
илиPNG
потому , что она используетсяimg
тег илиcanvas
. В моем примере вы можете просто предварительно загрузить плитки, если знаете ключи плиток (storage.add('x_y_z', 'data:image/png;base64,...')
для каждой сохраненной плитки), но вы всегда можете получить их, если знаете только границы (многоугольник) и масштабирование.tile.osm.org
(рендерер mapnik). Напримерhttp://tile.openstreetmap.org/10/590/329.png
(zoom
/x
/y
.png). Эти плитки имеютAccess-Control-Allow-Origin: *
заголовок, поэтому вы можете получить их с помощью ajax или получить URI данных (base64) с помощью холста. Вы уже можете скачать плитки с вашимmanifest.json
{id: 0-0-0}
, но вы должны уверены , что есть правоzoom
,x
,y
последовательность.Несколько лет назад (не совсем в каменном веке) я использовал подписанный Java-апплет, который запрашивал у своего сервера требования к синхронизации / обновлению, загружал соответствующие файлы с сервера и сохранял их в файловой системе пользователя (а не в базе данных). Это решение может сработать для вас, хотя вам понадобится кто-нибудь, чтобы написать апплет и подписать его. Для решений для баз данных такой апплет может использовать jdbc, доступный для большинства баз данных, использующих localhost на подходящем порту (например, 3306 для MySQL). Я считаю, что тег апплета устарел в Html5, но он все еще работает. Нет опыта работы с планшетами Android, поэтому не могу комментировать эту часть.
источник