Puede javascript acceder a un sistema de archivos? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Estaba bastante seguro de que la respuesta era NO, y por lo tanto Google gears, adobe AIR, etc.

Si yo tenía razón, entonces ¿cómo http://tiddlywiki.com ¿trabajo? Es persistente y está escrito en javascript. También es un solo archivo HTML que no tiene dependencias externas (del lado del servidor). ¿WTF? ¿Dónde / cómo almacena su estado?

Author: Joe, 2009-07-06

6 answers

Tiddlywiki tiene varios métodos para guardar datos, dependiendo del navegador que se utilice. Como se puede ver en la fuente.

  • Si ActiveX está habilitado, utiliza Scripting.FileSystemObject.
  • En navegadores basados en Gecko, intenta usar UniversalXPConnect.
  • Si Java está habilitado, utiliza el applet de Java TiddlySaver.
  • Si Java LiveConnect está habilitado, intenta usar las clases de archivo de Java.
 46
Author: Zr40,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-22 06:27:53

Archivo HTML5[1], FileWriter[2], y sistema de archivos[3] Las API están disponibles en el último canal de desarrolladores de Google Chrome. La API del sistema de archivos le permite leer / escribir en un sistema de archivos sandbox dentro de un espacio que el navegador conoce. No puede, por ejemplo, abrir la carpeta 'Mis imágenes' en el FS local del usuario y leer / escribir en eso. Eso es algo en proceso, pero no estará listo por un tiempo. Ejemplo de escritura de un archivo:

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);
  }
}

Mira esto HTML5 Storage slide deck para más fragmentos de código.

 35
Author: ebidel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-18 21:29:35

Utiliza un archivo java referencias como esta:

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
Author: Rich Bradshaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-06 14:24:34

Técnicamente puedes hacer

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

En un navegador compatible con netscape (Firefox, Mozilla, Netscape), y preguntará al usuario* si permite o no el acceso al sistema de archivos, pero esto no es portable.

* una vez por proceso del navegador

 4
Author: Jason S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-06 15:23:40

¿Puede javascript acceder a un sistema de archivos?

No fuera del área de sandbox mencionada anteriormente, a mi leal saber y entender. Sin embargo, puede acceder a un applet java firmado que tiene métodos públicos llamables que pueden acceder a todos los archivos. Lo he hecho y funciona bien y es cross browser.

La parte de firma es un poco complicada y para uso profesional es posible que deba pagar por un certificado de firma de código que autorice su identidad. Consíguelo de algún lugar como Verisign. De esta manera, los usuarios al menos saben por quién está escrito el applet (si eso ayuda). Puede firmarlo usted mismo de forma gratuita, pero una de esas ventanas emergentes de "posible riesgo de seguridad" se producirá en el primer uso para la autorización por parte del usuario.

Pensarías que tales applets firmados para la escritura de archivos ya existirían para descargar, pero no pude encontrar ninguno a través de la búsqueda. Si lo hicieron, podrías simplemente conectarlo a tu página, aprender la API y listo.

 4
Author: Anon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-15 18:49:15

La respuesta es ciertamente NO. Los applets de Java y los temidos complementos ActiveX se usan generalmente si esto es necesario

 2
Author: Sheff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-06 14:25:05