十六、文件访问(File Access)
1、读取文件(Reading a File)
Q:如何将文件读取到JavaScript变量中?
A:根据脚本运行的环境和文件的位置,你可以有以下选项:
关于前两个选项的讨论,请点击上面的超链接。
下面我们会讨论最后的一个——为脚本读取文件的Java applet助手。读取文件机制的一个可能实现如下:
1. 脚本调用applet的一个public方法。
2. 这个public方法在applet的另一个线程中初始化读取过程,然后返回。
3. Applet中另一个线程中的读取过程继续执行。同时,脚本持续问applet是否完成读取。
4. Applet完成读取,把文件内容放在applet的一个public的字符串变量中。
5. 脚本看到applet完成读取。
6. 脚本将文件内容从applet的public变量中复制到JavaScript的变量。
注意未签名的Java applet代码只能读取那些和代码有同一来源(the same origin)的文件。例如,如果你的未签名代码被发布在一个Web服务器上,那么它只允许通过URL阅读在同一个Web服务器上文件。如果你的代码在本地的磁盘上,那么(最多)它只能阅读在同一个磁盘上的文件。
如果你想阅读有不同来源的文件,你需要对代码签名。(更多信息,请参考写文件;十分相似的安全机制应用于读取那些和代码没有相同来源的文件。)
这里有一个实现了上述读取机制的简单的例子。下面的矩形是一个叫做ReadURL.class的Java applet。这个Applet读取选择的文件内容到一个public变量fileContent中。完成时,applet将它的public变量finished设为1。
Applet好像不被支持,请到原文处操作实例--译者注 |
示例中的脚本读取选择文件,这个文件包含了一个这个FAQ讨论的一些内容。
Choose a file to readJavaScript FAQ Home (file startpag.htm)Reading a File (file reading2.htm)Writing a File (file writinga.htm)启动读取进程的JavaScript代码如下:
var fileContent=''; var theLocation=''; function readFileViaApplet(n) { document.f1.t1.value='Reading in progress...'; document.ReadURL.readFile(theLocation); setTimeout("showFileContent()",100); } function showFileContent() { if (document.ReadURL.finished==0) { setTimeout("showFileContent()",100); return; } fileContent=document.ReadURL.fileContent; document.form1.textarea1.value=fileContent; }
2. 写文件(Writing a File)
Q:如果通过JavaScript写文件?
A:通过JavaScript写文件和从Java Applet写文件一样简单。脚本本身不能写文件,它需要调用一个Java applet的public方法为它完成所有写文件的工作。
坏消息是:
1. 写文件是一个授权操作,因此你的applet必须已经有数字签名以便写文件。
2. 针对Internet Explorer的Applet签名和针对Netscape Navigator的完全不同。
3. 已签名的applet在Netscape Navigator 3中也可能不正产工作。
4. 最坏的是,把授权操作放在已签名的applet的public方法中是非常不安全。如果你发布了这样一个applet,恶意代码可以很容易的推翻applet的public方法,你(applet发布者/签署者)将会因为任何破坏被起诉。
因此,尽管在主流浏览器的版本4中技术上可行,没有人通过签名的applet发布写文件的脚本。