2016-05-28 2 views
3

Согласно Exploring the FileSystem APIs наКак использовать webkitRequestFileSystem в файле: протокол

поддержки браузера ограничений & хранения

Вам может понадобиться --allow-file-access-from-files флаг, если вы отладки приложения из file://. Не используя эти флаги, вы получите в файле SECURITY_ERR или QUOTA_EXCEEDED_ERR FileError.

Запущенный хрома с --allow-file-access-from-files, --unlimited-storage и, возможно, устаревшим --unlimited-quota-for-files; также --unsafely-treat-insecure-origin-as-secure=file:///path/to/directory/* с --user-data-dir=/path/to/directory установить.

Интересно, что при открытии хром выводится уведомление

Вы используете неподдерживаемый флаг командной строки: --unsafely-treat-insecure-origin-as-secure. Стабильность и безопасность пострадают.

Существуют и другие флаги, которые не указаны, которые могут быть использованы; игнорировали уведомление, как это было до сих пор в состоянии установить и получить localStorage в file: протокола, spcecifically файлов file:///path/to/directory/*, хотя

navigator.webkitTemporaryStorage.requestQuota(1024*1024, function(grantedBytes) { 
    console.log(grantedBytes) 
}, errorHandler); 

вошли 0, где errorHandler является

function errorHandler(e) { 
    console.log(e) 
} 

Также

function writeFile(fs) { 
    fs.root.getFile("file.txt", {create: true}, function(fileEntry) { 
    fileEntry.createWriter(function(fileWriter) { 
     fileWriter.onwriteend = function(e) { 
     // call `readFile` 
     window.requestFileSystem(window.TEMPORARY, 1024*1024, readFile, errorHandler); 
     }; 
     fileWriter.onerror = errorHandler; 
     var blob = new Blob(["abc"], {type: "text/plain"}); 
     fileWriter.write(blob); 
    }, errorHandler); 
    }, errorHandler); 
} 

window.requestFileSystem(window.TEMPORARY, 1024*1024, writeFile, errorHandler); 

function readFile(fs) { 
    fs.root.getFile("file.txt", {}, function(fileEntry) { 
    fileEntry.file(function(file) { 
     var reader = new FileReader(); 
     reader.onloadend = function(e) { 
     console.log(e.target.result) 
     }; 
     reader.readAsText(file); 
    }, errorHandler); 
    }, errorHandler); 
} 

заготовленная

FileError {code: 7, name: "InvalidStateError", message: "An operation that depends on state cached in an in…he state had changed since it was read from disk."} 
code:7 
message:"An operation that depends on state cached in an interface object was made but the state had changed since it was read from disk." 
name:"InvalidStateError" 
__proto__:DOMError 

Вопрос: Какие изменения необходимы для флажков запуска, обходных путей или других подходов, которые позволили бы использовать протокол webkitRequestFileSystem по протоколу file:?

+1

Я не получил эту ошибку или '0' для' givenBytes' при ее тестировании. Используются все указанные вами флаги, кроме: '--unsafely-treat-insecure-origin-as-secure',' --unlimited-quota-for-files', '-unlimited-storage'. Единственное изменение, которое я должен был сделать, заключалось в том, что если захотеть делать постоянные данные, сначала нужно использовать 'navigator.webkitPersistentStorage.requestQuota'. –

+0

@PatrickEvans Вы могли писать в 'FileSystem' на' file: 'protocol? Какая версия хром или хром? Можете ли вы опубликовать файл '.html', который вы протестировали в файле' file: 'и' js', используемом в файле '.html'? – guest271314

+1

Да, он написал файл с 'abc' внутри него для обоих temp и persistent. Я попробовал это как с Chrome (50.0.2661.102 m), так и с Chromium (53.0.2752.0) как на Windows 10. Конечно, я отредактирую ссылку во второй –

ответ

2

Первоначальная попытка была получена с ошибкой в ​​terminal относительно недостатка места на устройстве. Получены две отдельные ошибки: code 7InvalidStateError и code 3AbortError. Обратите внимание, что хром был запущен в песочнице в каждой конфигурации.

удалось достичь ожидаемого результата записи в FileSystemfile: в протоколе путем регулирования запуска флагов --allow-file-access-from-files и указать другую папку конфигурации хрома в --user-data-dir=/newer/version/of/profile/folder; --unlimited-quota-for-files и --unsafely-treat-insecure-origin-as-secure=file:///path/to/directory/* не были необходимы для достижения требований.

Не совсем понятно, почему исходная папка профиля использовала зарегистрированные ошибки при попытке доступа к FileSystem по протоколу file:. Папка могла быть из предыдущей версии хрома. Обычно запускает новую или новейшую версию хром из командной строки, где папка chromium в каталоге конфигурации, возможно, была более старой версией с уже установленными настройками.При рассмотрении terminal в какой-то момент сообщение no space left on disk было зарегистрировано в связи с FileSystem при запуске с использованием прежней папки конфигурации профиля. Пробовал более новую версию папки профиля хрома, которая решила проблему.

Значительный кредит для решения обусловлен @PatrickEvans для проверки того, что этот процесс действительно возможен; что было более чем вероятно ошибка пользователя, которая ограничивала реализацию ожидаемого результата.

var requestedBytes = 16, 
    _grantedBytes; 

function errorHandler(e) { 
    console.log(e) 
} 

function writeFile(fs) { 
    console.log(fs) 
    fs.root.getFile("file.txt", { 
    create: true 
    }, function(fileEntry) { 
    fileEntry.createWriter(function(fileWriter) { 
     fileWriter.onwriteend = function(e) { 
     // call `readFile` 
     console.log(_grantedBytes); 
     window.webkitRequestFileSystem(window.TEMPORARY 
             , _grantedBytes 
             , readFile 
             , errorHandler); 
     }; 
     fileWriter.onerror = errorHandler; 
     var blob = new Blob(["abc"], { 
     type: "text/plain" 
     }); 
     fileWriter.write(blob); 
    }, errorHandler); 
    }, errorHandler); 
} 

navigator.webkitTemporaryStorage.requestQuota(requestedBytes 
, function(grantedBytes) { 
    console.log(grantedBytes); 
    _grantedBytes = grantedBytes; 
    window.webkitRequestFileSystem(window.TEMPORARY 
            , grantedBytes 
            , writeFile 
            , errorHandler); 

}, errorHandler); 

function readFile(fs) { 
    fs.root.getFile("file.txt", {}, function(fileEntry) { 
    fileEntry.file(function(file) { 
     var reader = new FileReader(); 
     reader.onloadend = function(e) { 
     console.log(e.target.result, fileEntry.toURL()); 
     }; 
     reader.readAsText(file); 
    }, errorHandler); 
    }, errorHandler); 
} 
+0

Замечательно, что вы можете увидеть проверенный функциональный рабочий пример. Thnaks. (За исключением первых двух экземпляров console.log() не имеют точек с запятой). Все работало отлично, кроме этого. – user1863152

 Смежные вопросы

  • Нет связанных вопросов^_^