web-dev-qa-db-fra.com

Javascript peut-il accéder à un système de fichiers?

J'étais presque sûr que la réponse était [~ # ~] non [~ # ~] , et donc google gears, Adobe AIR, etc.

Si j'avais raison, comment fonctionne http://tiddlywiki.com ? Il est persistant et écrit en javascript. Il s'agit également d'un seul fichier HTML qui n'a pas de dépendances externes (côté serveur). WTF? Où/comment stocke-t-il son état?

37
Joe

Tiddlywiki propose plusieurs méthodes d'enregistrement des données, selon le navigateur utilisé. Comme vous pouvez le voir dans la source .

  • Si ActiveX est activé, il utilise Scripting.FileSystemObject.
  • Sur les navigateurs basés sur Gecko, il essaie d'utiliser UniversalXPConnect.
  • Si Java est activé, il utilise l'applet TiddlySaver Java.
  • Si Java LiveConnect est activé, il essaie d'utiliser les classes de fichiers de Java.
46
Zr40

Les API File [ 1 ], FileWriter [ 2 ] et FileSystem [] sont disponibles dans le dernier canal développeur de Google Chrome. L'API FileSystem vous permet de lire/écrire sur un système de fichiers sandbox dans un espace que le navigateur connaît. Vous ne pouvez pas, par exemple, ouvrir le dossier "Mes images" sur le local FS) local de l'utilisateur et y lire/écrire. C'est quelque chose en préparation, mais il ne sera pas prêt avant un certain temps. Exemple d'écriture d'un fichier:

window.requestFileSystem(
  TEMPORARY,        // persistent vs. temporary storage
  1024 * 1024,      // 1MB. Size (bytes) of needed space
  initFs,           // success callback
  opt_errorHandler  // opt. error callback, denial of access
);

function initFs(fs) {
  fs.root.getFile('logFile.txt', {create: true}, function(fileEntry) {

    fileEntry.createWriter(function(writer) {  // FileWriter

      writer.onwrite = function(e) {
        console.log('Write completed.');
      };

      writer.onerror = function(e) {
        console.log('Write failed: ' + e.toString());
      };

      var bb = new BlobBuilder();
      bb.append('Lorem ipsum');
      writer.write(bb.getBlob('text/plain'));

    }, errorHandler);
  }
}

Consultez cette diapositive de stockage HTML5 pour plus d'extraits de code.

36
ebidel

Il utilise un Java références de fichier comme ceci:

drivers.tiddlySaver = {
        name: "tiddlySaver",
        deferredInit: function() {
            if(!document.applets["TiddlySaver"] && !$.browser.mozilla && !$.browser.msie && document.location.toString().substr(0,5) == "file:") {
                $(document.body).append("<applet style='position:absolute;left:-1px' name='TiddlySaver' code='TiddlySaver.class' archive='TiddlySaver.jar' width='1'height='1'></applet>");
            }
        },
        isAvailable: function() {
            return !!document.applets["TiddlySaver"];
        },
        loadFile: function(filePath) {
            var r;
            try {
                if(document.applets["TiddlySaver"]) {
                    r = document.applets["TiddlySaver"].loadFile(javaUrlToFilename(filePath),"UTF-8");
                    return (r === undefined || r === null) ? null : String(r);
                }
            } catch(ex) {
            }
            return null;
        },
        saveFile: function(filePath,content) {
            try {
                if(document.applets["TiddlySaver"])
                    return document.applets["TiddlySaver"].saveFile(javaUrlToFilename(filePath),"UTF-8",content);
            } catch(ex) {
            }
            return null;
        }
    }
12
Rich Bradshaw

Javascript peut-il accéder à un système de fichiers?

Pas en dehors de la zone de bac à sable mentionnée ci-dessus, à ma connaissance. Cependant, il peut accéder à une applet signée Java qui a des méthodes publiques appelables qui peuvent accéder à tous les fichiers. Je l'ai fait et cela fonctionne bien et est multi-navigateur.

La partie signature est quelque peu impliquée et pour un usage professionnel, vous devrez peut-être payer un certificat de signature de code qui autorise votre identité. Obtenez-le d'un endroit comme Verisign. De cette façon, les utilisateurs savent au moins par qui l'applet est écrit (si cela aide). Vous pouvez le signer vous-même gratuitement, mais l'une de ces fenêtres contextuelles "risque de sécurité possible" apparaîtra lors de la première utilisation pour l'autorisation de l'utilisateur.

On pourrait penser que de telles applets signées pour l'écriture de fichiers existent déjà pour le téléchargement, mais je n'en ai trouvé aucune via la recherche. S'ils l'ont fait, vous pouvez simplement le brancher sur votre page, apprendre l'API et c'est parti.

4
Anon

Techniquement, vous pouvez le faire

netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserWrite');

dans un navigateur compatible avec netscape (Firefox, Mozilla, Netscape), et il demandera à l'utilisateur * d'autoriser ou non l'accès au système de fichiers, mais ce n'est pas portable.

* une fois par processus de navigation

4
Jason S

La réponse est en effet NON. Java applets, et les plugins ActiveX redoutés sont généralement utilisés si cela est nécessaire

2
Sheff