2009-07-06 15 views
36

Ero abbastanza sicuro che la risposta è stata NO , e quindi Google Gears, Adobe AIR, eccjavascript può accedere a un filesystem?

Se avevo ragione, allora come si fa http://tiddlywiki.com lavoro? È persistente e scritto in javascript. È anche solo un singolo file HTML che non ha dipendenze esterne (serveride). WTF? Dove/come memorizza il suo stato?

+0

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

risposta

45

Tiddlywiki ha diversi metodi per il salvataggio dei dati, a seconda del browser utilizzato. As you could see in the source.

  • Se ActiveX è abilitato, utilizza Scripting.FileSystemObject.
  • Sui browser basati su Gecko, tenta di utilizzare UniversalXPConnect.
  • Se Java è abilitato, utilizza l'applet Java di TiddlySaver.
  • Se Java LiveConnect è abilitato, tenta di utilizzare le classi di file Java.
+0

Sarebbe positivo se la risposta includesse il puntatore al codice effettivo nella codebase di github. – GabrielC

12

Si utilizza un file java riferimenti come questo:

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

La risposta è davvero NO. applet Java, e i plugin ActiveX temuto di solito vengono utilizzati se ciò è richiesto

4

Tecnicamente si può fare

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

in un browser Netscape-compatibile (Firefox, Mozilla, Netscape), e chiederà all'utente * se consentire o meno l'accesso al filesystem, ma questo non è portatile.

* una volta al processo del browser

35

File di HTML5 [1], FileWriter [2], e FileSystem [3] API sono disponibili nell'ultima canale sviluppatore di Google Chrome. L'API FileSystem consente di leggere/scrivere su un filesystem sandbox all'interno di uno spazio a conoscenza del browser. Ad esempio, non è possibile aprire la cartella "Immagini" nella locale FS dell'utente e leggerla/scriverla. È qualcosa in lavorazione, ma non sarà pronto per un po '. Esempio di scrittura di un file:

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

Partenza questo HTML5 Storage slide deck per ulteriori frammenti di codice.

3

Può javascript accedere a un filesystem?

Non al di fuori dell'area sandbox menzionata sopra, per quanto ne so. Tuttavia, può accedere a un'applet java firmata con metodi pubblici richiamabili che possono accedere a tutti i file. L'ho fatto e funziona bene ed è cross browser.

La parte di firma è in qualche modo coinvolta e per l'uso professionale potrebbe essere necessario pagare un certificato di firma del codice che autorizza la tua identità. Scaricalo da qualche posto come Verisign. In questo modo gli utenti almeno sanno da chi viene scritta l'applet (se questo aiuta). Puoi firmarlo gratuitamente, ma uno di quei "possibili rischi per la sicurezza" apparirà al primo utilizzo per l'autorizzazione da parte dell'utente.

Si potrebbe pensare che tali applet firmate per la scrittura dei file esistessero già per il download ma non sono riuscito a trovarle tramite la ricerca. Se lo facessero, potresti semplicemente collegarlo alla tua pagina, imparare l'API e partire.

Problemi correlati