В настоящее время я работаю над приложением, которое должно работать в автономном режиме. Это имеет положительный побочный эффект, мы используем различные возможности хранения HTML5. Одним из них является File API , который мы используем для локального хранения изображений, прежде чем ставить их в очередь для загрузки на внутренний сервер.
В этой статье я поделюсь некоторым кодом, как мы это сделали. Пример работает в Google Chrome — для манипулирования DOM я буду использовать JQuery.
Начнем с простого, у нас есть один файл ввода для изображений и область для отображения загруженных изображений.
|
1
2
3
4
|
<body> <input type="file" accept="image/*" class="js-image-upload"/> <div class="js-image-container"></div></body> |
Когда пользователь выбирает файл, мы хотим сохранить изображение.
|
1
2
3
4
5
6
|
$(document).on('change', '.js-image-upload', function (event) { var file = event.target.files[0]; var fileName = createTempName(file); writeImage(fileName, file);}); |
Хранение изображений осуществляется этим методом.
|
01
02
03
04
05
06
07
08
09
10
11
|
function writeImage(fileName, file) { getFileSystem(function (fileSystem) { fileSystem.root.getFile(fileName, {create: true}, function (fileEntry) { fileEntry.createWriter(function (fileWriter) { fileWriter.onwriteend = writeSuccessFull; fileWriter.onerror = errorFct; fileWriter.write(file); }, errorFct); }); });} |
Что здесь происходит?
- Получить файловую систему
- Создайте файл по указанному имени в его корне
- Создать писателя для этого файла
- Сконфигурируйте успешный и ошибочный обратный вызов, когда происходит асинхронная запись файла
- Напишите блоб файла, используя писателя
Извлечение файловой системы является двухэтапной процедурой. Нам нужно запросить квоту из браузера, а затем получить файловую систему.
|
1
2
3
4
5
6
|
var SIZE = 100 * 1024 * 1024; // 100 MBvar getFileSystem = function (successFct) { navigator.webkitPersistentStorage.requestQuota(SIZE, function () { window.webkitRequestFileSystem(window.PERSISTENT, SIZE, successFct, errorFct); }, errorFct);}; |
Пользователю будет предложено предоставить веб-сайту доступ к постоянному хранилищу. Есть некоторые ошибки, которые вы можете получить, например, когда пользователь не принимает наш запрос.
Но давайте предположим, что пользователь доверяет нам. Затем мы хотим отреагировать на удачную запись и показать изображение. Мы можем использовать локальный URL-адрес хранилища файлов и добавить файл в очередь, чтобы загрузить файл на сервер.
|
01
02
03
04
05
06
07
08
09
10
|
var showImage = function (fileName) { var src = 'filesystem:' + window.location.origin + '/persistent/' + fileName; var img = $('<img>').attr('src', src); $('.js-image-container').append(img);};var writeSuccessFull = function () { addToSyncQueue(fileName); showImage(fileName);}; |
Я опускаю логику очереди здесь. Вы можете сохранить очередь изображений для загрузки в веб-хранилище или IndexedDB вашего приложения. Чтобы прочитать изображение из хранилища, вы можете использовать что-то вроде этого:
|
01
02
03
04
05
06
07
08
09
10
|
var readImage = function (fileName, successFct) { getFileSystem(function (fileSystem) { fileSystem.root.getFile(fileName, {}, function (fileEntry) { fileEntry.file(successFct, errorFct); }, errorFct); } );}; |
Итак, это краткий обзор того, что мы сделали здесь. Рабочий пример кода можно найти здесь: https://gist.github.com/jthoenes/3668856a188d600e02d6
Надеюсь, что это было полезно для нескольких людей, имеющих дело с подобными проблемами. Не стесняйтесь задавать вопросы, когда что-то всплывает у вас в голове.
| Ссылка: | HTML5: автономная загрузка изображений от нашего партнера JCG Йоханнеса Тона в блоге блога Johannes Thönes . |