【问题标题】:How to create a file using javascript in Mozilla Firefox如何在 Mozilla Firefox 中使用 javascript 创建文件
【发布时间】:2010-06-18 07:10:08
【问题描述】:

我想在javascript中编写一个函数来创建一个文件并向其中写入一些内容,我正在使用firefox,在这种情况下有人可以帮助我吗?

谢谢...

【问题讨论】:

  • 我回答了这个问题,因为它指的是在客户端创建一个文件,就像 TiddlyWiki 一样。有些人在解释您询问 JavaScript 是否可以在服务器端创建文件时忽略了这个问题。也许你应该澄清一下。

标签: javascript firefox file operation


【解决方案1】:

您可以在 Firefox 中使用 JavaScript 编写文件,但您必须使用 XPCOM 对象(内部浏览器 API)。这对于从网页加载的 JavaScript 是不允许的,它旨在供运行在 Firefox 插件中的 JavaScript 使用(具有高级别的权限)。

有一种方法可以让非特权(网页)JavaScript 请求更多权限,如果用户授予它(将弹出一个对话框询问权限),网页代码将能够写入文件。

但在您进一步阅读之前,请注意:

这不是标准的 JavaScript,除非您正在开发一个非常特定的应用程序,否则我不会推荐这种方法,它将以非常特定的方式使用(例如,http://www.tiddlywiki.com/ 仅客户端 JavaScript-HTML 的 wiki )。

在网站上请求 XPCOM 权限是一种不好的做法!它基本上等同于运行您刚刚从站点下载的 .exe。您要求用户以运行 Firefox 的用户的身份授予对其计算机的完全访问权限(读取、写入、执行)。

请求使用XPCOM的权限(这会提示用户确认,没有办法避免):

netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");

然后,使用 XPCOM 对象写入文件(来自 Mozilla 开发者网络的示例代码):

   1. // file is nsIFile, data is a string  
   2. var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"].  
   3.                          createInstance(Components.interfaces.nsIFileOutputStream);  
   4.   
   5. // use 0x02 | 0x10 to open file for appending.  
   6. foStream.init(file, 0x02 | 0x08 | 0x20, 0666, 0);   
   7. // write, create, truncate  
   8. // In a c file operation, we have no need to set file mode with or operation,  
   9. // directly using "r" or "w" usually.  
  10.   
  11. // if you are sure there will never ever be any non-ascii text in data you can   
  12. // also call foStream.writeData directly  
  13. var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].  
  14.                           createInstance(Components.interfaces.nsIConverterOutputStream);  
  15. converter.init(foStream, "UTF-8", 0, 0);  
  16. converter.writeString(data);  
  17. converter.close(); // this closes foStream  

您可以在此处找到有关使用 XPCOM 在 Firefox 中 I/O 的更多信息:https://developer.mozilla.org/en-US/docs/Code_snippets/File_I_O

【讨论】:

    【解决方案2】:

    来自网站的 Javascript 无法访问本地文件系统。

    如果您想存储数据,请将其存储在服务器或 cookie 中。

    【讨论】:

      【解决方案3】:

      出于安全原因,禁止直接从浏览器写入文件系统。但是,使用 html5 可以支持离线存储。 Take a look here.

      Grz,克里斯。

      【讨论】:

        【解决方案4】:

        Javascript 在客户端上下文中执行。

        http://www.tek-tips.com/viewthread.cfm?qid=1171273&page=1

        【讨论】:

        • 但它显示了一些错误,例如“未定义创建对象”。
        【解决方案5】:

        会有一个用于此的 API.. 文件编写器 API。早期的规范在这里: http://www.w3.org/TR/file-writer-api/ 它还没有在任何浏览器中实现。

        更新:似乎已经存在一个实现。查看http://caniuse.com/filesystemhttp://www.html5rocks.com/en/tutorials/file/filesystem/

        【讨论】:

          【解决方案6】:

          虽然每个人都回答说 javascript 没有能力在远程服务器上写入文件是正确的,出于安全原因这是正确的,但您想要完成的事情可能仍然是可能的。

          例如,如果您希望使用 javascript 在您的网站上创建文件,您可以使用一些服务器端脚本语言和 AJAX 调用来实现。

          例子:

          您的服务器上有一个名为 update_last_access.php 的文件,它将创建一个文件,该文件将上次访问该文件的时间存储在某个任意文件中。

          如果您随后让您的 javascript 函数对该脚本进行 AJAX 调用,例如在 jquery 中

          $.get("update_last_access.php")
          

          然后这将执行服务器端脚本并写入文件。

          在为您提供更多帮助之前,您必须弄清楚您要做什么。

          【讨论】:

            【解决方案7】:

            您可以在 Firefox 3.6 中使用 JavaScript 从文件系统读取文件 - 例如,请参阅我的 EPUB reader proof of concept

            但是,您不能直接从 JavaScript 编写文件。您必须通过服务器。

            【讨论】:

              【解决方案8】:

              Mozilla 计划将 FileSaver 包含在 Gecko 9 中: https://bugzilla.mozilla.org/show_bug.cgi?id=557540

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-01-02
                • 2014-12-09
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多