JavaScript能访问文件系统吗?

38

我很确定答案是,因此有google gears、adobe AIR等技术。

如果我的想法是正确的,那么 http://tiddlywiki.com 是如何工作的?它是用 JavaScript 编写的持久化应用,只有单个 HTML 文件,没有任何外部(服务器端)依赖。它的状态存储在哪里?


http://www.html5rocks.com/en/tutorials/file/filesystem/ - Pacerier
6个回答

46

Tiddlywiki有几种保存数据的方法,取决于所使用的浏览器。 您可以在源代码中看到

  • 如果启用了ActiveX,则使用Scripting.FileSystemObject。
  • 在基于Gecko的浏览器上,它尝试使用UniversalXPConnect。
  • 如果启用了Java,则使用TiddlySaver Java applet。
  • 如果启用了Java LiveConnect,则尝试使用Java的文件类。

如果答案包含指向Github代码库中实际代码的指针,那就太好了。 - Gabriel Chung

36

HTML5的File [1],FileWriter [2] 和FileSystem [3] API在最新版的Google Chrome开发者频道中可用。FileSystem API允许您在浏览器了解的空间内读写沙盒文件系统。例如,您不能打开用户本地FS上的“My Pictures”文件夹并进行读写操作。这是正在开发中的事情,但它不会很快准备好。以下是编写文件的示例:

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

查看此HTML5存储幻灯片以获取更多代码片段。


12

它使用像这样的Java文件引用:

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

4

从技术上讲,您可以这样做

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

在兼容Netscape的浏览器(Firefox,Mozilla,Netscape)中,它会询问用户是否允许文件系统访问,但这不是可移植的。 每个浏览器进程只会询问一次。

4
JavaScript能访问文件系统吗?
据我所知,除了上述沙盒区域之外JavaScript无法访问文件系统。但是,它可以访问一个带有可调用公共方法的已签名Java小程序,该程序可以访问所有文件。我已经使用过并且它工作得很好,并且支持跨浏览器。
签名部分有些复杂,对于职业使用,您可能需要支付代码签名证书的费用,以授权您的身份。从像Verisign这样的地方获取。这样至少用户知道是由谁编写的小程序(如果这有所帮助)。您可以免费自行签名,但是在首次使用时用户将会看到一个“可能存在安全风险”的弹出窗口,需要进行授权。
您可能会认为已经存在了用于文件写入的这种已签名小程序,并且可以通过搜索找到它们的下载链接。如果这些小程序确实存在,那么您只需将其插入页面中,学习API即可轻松上手。

2
答案确实是否定的。如果需要,通常会使用Java小程序和令人生畏的ActiveX插件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接