Comment utiliser WebkitRequestFileSystem au fichier: protocole

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 du file:// . Le fait de ne pas utiliser ces drapeaux entraînera un QUOTA_EXCEEDED_ERR SECURITY_ERR ou QUOTA_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); }