Selon Exploring the FileSystem API à
Limites de support et de stockage du navigateur
Vous pouvez avoir besoin de l'
--allow-file-access-from-files
si vous déboguez votre application dufile://
. Le fait de ne pas utiliser ces drapeaux entraînera unQUOTA_EXCEEDED_ERR
SECURITY_ERR
ouQUOTA_EXCEEDED_ERR
FileError.
--allow-file-access-from-files
chrome avec --allow-file-access-from-files
, --unlimited-storage
et éventuellement obsolète --unlimited-quota-for-files
; Également – --unsafely-treat-insecure-origin-as-secure=file:///path/to/directory/*
avec --user-data-dir=/path/to/directory
set.
Fait intéressant, lorsque le chrome ouvre une notification s'affiche
Vous utilisez un indicateur de ligne de commande non pris en charge: – moins
--unsafely-treat-insecure-origin-as-secure
. La stabilité et la sécurité en souffriront.
Il existe d'autres drapeaux qui ne sont pas spécifiés qui peuvent être utilisés; Notification ignorée, puisqu'il était encore capable de définir et d'obtenir localStorage
au file:
protocole, spcecifically fichiers au file:///path/to/directory/*
, cependant
navigator.webkitTemporaryStorage.requestQuota(1024*1024, function(grantedBytes) { console.log(grantedBytes) }, errorHandler);
Connecté 0
, où errorHandler
est
function errorHandler(e) { console.log(e) }
Aussi
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); }
Connecté
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
Question: Quelles sont les modifications nécessaires lors du lancement des drapeaux, solutions de contournement ou d'autres approches qui permettraient l'utilisation de webkitRequestFileSystem
au file:
protocole?
L'essai initial a reçu des erreurs au terminal
concernant le manque d'espace sur l'appareil. A reçu deux erreurs distinctes code 7
InvalidStateError
et code 3
AbortError
. Note, le chrome a été lancé dans un bac à sable à chaque configuration.
A été capable de réaliser le résultat attendu d'écriture dans FileSystem
au file:
protocole en ajustant les drapeaux de lancement à --allow-file-access-from-files
et en spécifiant un autre dossier de configuration de chrome à --user-data-dir=/newer/version/of/profile/folder
; --unlimited-quota-for-files
--unsafely-treat-insecure-origin-as-secure=file:///path/to/directory/*
et --unsafely-treat-insecure-origin-as-secure=file:///path/to/directory/*
ne sont pas nécessaires pour atteindre l'exigence.
Pas tout à fait certain pourquoi le dossier de profil d'origine utilisait des erreurs enregistrées lors de la tentative d'accès à FileSystem
au file:
protocole. Le dossier pourrait provenir d'une version précédente du chrome. Généralement, lancez la version nouvelle ou la plus récente du chrome à partir de la ligne de commande où chromium
dossier chromium
dans le répertoire de configuration peut avoir été une ancienne version avec des préférences déjà définies. Lorsqu'on a examiné le terminal
à un moment donné, no space left on disk
n'a été enregistré en relation avec FileSystem
lorsqu'il a été lancé à l'aide d'un ancien dossier de configuration de profil. Essayé une version plus récente du dossier de profil de chrome qui résolvait le problème.
Beaucoup de crédit pour la solution est due à @PatrickEvans pour vérifier que ce processus était effectivement possible; Qu'il était plus qu'une erreur d'utilisateur qui limitait la réalisation du résultat attendu.
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); }