2009-07-06 10 views
36

Ich war ziemlich sicher, dass die Antwort NO und damit Google Gears, Adobe AIR, usw.Kann Javascript auf ein Dateisystem zugreifen?

Wenn ich richtig war, dann wie funktioniert http://tiddlywiki.com Arbeit war? Es ist hartnäckig und in Javascript geschrieben. Es ist auch nur eine einzelne HTML-Datei, die keine externen (serverseitigen) Abhängigkeiten hat. WTF? Wo/wie speichert es seinen Zustand?

+0

http://www.html5rocks.com/de/tutorials/file/filesystem/ – Pacerier

Antwort

45

TiddlyWiki hat mehrere Methoden der Daten zu speichern, abhängig davon, welcher Browser verwendet wird. As you could see in the source.

  • Wenn ActiveX aktiviert ist, verwendet es Scripting.FileSystemObject.
  • Auf Gecko-basierten Browsern, versucht es UniversalXPConnect zu verwenden.
  • Wenn Java aktiviert ist, verwendet er die TiddlySaver Java-Applet.
  • Wenn Java LiveConnect aktiviert ist, wird versucht, die Java-Datei Klassen zu verwenden.
+0

Es wäre gut, wenn die Antwort den Zeiger auf den tatsächlichen Code in der GitHub-Codebasis enthält. – GabrielC

12

Es verwendet eine Java-Datei verweist wie folgt aus:

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

Die Antwort ist in der Tat NO. Java-Applets und der gefürchtete ActiveX-Plugins verwendet werden, in der Regel, wenn diese

4

Technisch ist erforderlich Sie

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

in einem Netscape-kompatible Browser (Firefox, Mozilla, Netscape) tun können, und es wird den Benutzer fragen * ob Dateisystemzugriff erlaubt ist oder nicht, aber dies ist nicht übertragbar.

* einmal pro Browser-Prozess

35

HTML5 die Datei [1], Filewriter [2] und Filesystem [3] APIs in dem neuesten Entwicklerkanal von Google Chrome verfügbar ist. Mit der FileSystem-API können Sie in einem Sandbox-Dateisystem innerhalb eines Bereichs, den der Browser kennt, lesen/schreiben. Sie können zum Beispiel den Ordner "Meine Bilder" nicht auf dem lokalen FS des Benutzers öffnen und lesen/schreiben. Das ist etwas in Arbeit, aber es wird für eine Weile nicht bereit sein. Beispiel für das Schreiben einer Datei:

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

Schauen Sie sich diese HTML5 Storage slide deck für mehr Code-Schnipsel.

3

Kann Javascript Zugriff auf ein Dateisystem?

Nicht außerhalb der oben genannten Sandbox-Bereich, nach meinem besten Wissen. Es kann jedoch auf ein signiertes Java-Applet zugreifen, das öffentliche Methoden aufruft, die auf alle Dateien zugreifen können. Ich habe es getan und es funktioniert gut und ist Cross-Browser.

Die Unterzeichnung Teil ist etwas aufwendig und für den professionellen Einsatz Sie könnten für eine Codesignierungszertifikat zahlen müssen, die Ihre Identität autorisiert. Holen Sie es von einem Ort wie Verisign. So wissen Benutzer zumindest, wer das Applet geschrieben hat (wenn das hilft). Sie können es selbst kostenlos signieren, aber eines dieser "möglichen Sicherheitsrisiko" -Popups wird bei der ersten Verwendung zur Autorisierung durch den Benutzer auftreten.

Sie würden denken, dass eine solche signierte Applets für das Schreiben von Dateien zum Download bereits existieren würde, aber ich konnte nicht über die Suche finden. Wenn dies der Fall ist, können Sie es einfach in Ihre Seite einbinden, die API lernen und los geht's.