Возможно ли использовать webkitRequestFileSystem от Service Worker? - PullRequest
1 голос
/ 27 февраля 2020

Моя идея - использовать <input type="file"> для загрузки файла, затем через webkitRequestFileSystem сохранить в FileSystem, как это ...

body.innerHTML = `<input type="file">`;
body.children[0].addEventListener("change", copyFiles);

...

function copyFiles() {
for (var i = 0; i < this.files.length; i++) {
    (function (f) {
        navigator.webkitPersistentStorage.queryUsageAndQuota(function (usage, granted) {
            if ((granted - usage) < f.size) {
                navigator.webkitPersistentStorage.requestQuota((granted + f.size), function () {
                    createFile(f);
                }, errorHandler);
            } else {
                createFile(f);
            }
        });
    })(this.files[i]);
}
}

...

function createFile(file) {
window.webkitRequestFileSystem(window.PERSISTENT, (file.size * 1.1), function (fileManager) {
    fileManager.root.getFile(file.name, {create: true, exclusive: true}, function (fileEntry) {
        fileEntry.createWriter(function (fileWriter) {
            fileWriter.write(file);
        }, errorHandler);
    }, errorHandler);
}, errorHandler);
}

И это работает, теперь я хочу использовать сервисный работник для чтения и отправки небольших пакетов содержимого этих файлов на мой сервер.

Я новичок в Сервисе Работники и я пытались, но я получил self.webkitRequestFileSystem is not a function

Активация Service Worker ...

window.addEventListener("load", function () {
if ('serviceWorker' in navigator) {
    window.addEventListener("message", function(e){
        console.log(e);
    });
    navigator.serviceWorker.register('js/swa.js').then(function (swr) {
        swr.sync.register('syncTest');
    }).catch(function (error) {
        console.log(error);
    });
} else {
    console.log("Service Worker", "Not available.");
}
});

И скрипт ServiceWorker


function getAllEntries(dirReader) {
    var entries = dirReader.readEntries();

    for (var i = 0, entry; entry = entries[i]; ++i) {
        paths.push(entry.toURL()); // Stash this entry's filesystem: URL.

        // If this is a directory, we have more traversing to do.
        if (entry.isDirectory) {
            getAllEntries(entry.createReader());
        }
    }
}

self.addEventListener('sync', function (event) {
    try {
        var fs = self.webkitRequestFileSystem(self.PERSISTENT, 1024 * 1024 /*1MB*/);

        getAllEntries(fs.root.createReader());

        self.postMessage({entries: paths});
    } catch (e) {
        console.log(e);
    }
}); 
...