日前,Mozilla 的 Arun Ranganathan 向 W3C 提交了一个草案,旨在推出一个 API,让 脚本直接操作本地文件,Firefox 的最新浏览器版本中已经对该 API 提供了大量的支持,不过出于安全考虑,该API 将只对本地文件提供有限的访问。

该 API 引入了一个 FileReader 对象,可以异步加载本地文件系统中的文件,并允许开发者为诸如加载失败,进度,加载完成等事件分配回调函数,它提供的方法可以从本地文件中读取文本或二进制数据,并通过一个 abort 方法随时打断操作。

FileReader 对象使客户端的文件访问成为现实,用户不必再象以前那样首先将文件上传到服务器才能处理,事实上,IE 和 Firefox 已经拥有一些非标准的方法访问本地文件,但这些方法并非标准 JavaScript 行为。

FileReader 对象并不需要特别的权限,但出于显然的安全考虑,直接使用文件路径进行访问是不允许的,必须结合常规的 HTML file 对象,用户点击浏览之后,选择本地文件,JavaScript 再通过 DOM 引用该文件并进行操作,这个机制使得该 API 相对安全一些,因为任何本地文件的获取都需要用户的人工参与。

以下例子使用该 API 打开一个本地文件并将文件内容显示在一个 div 容器中,我们甚至可以在 div 上加上 contentEditable 属性,用户可以直接编辑文件的内容,不过,该 API 并没有提供将文件内容写回本地文件的方法,因此你编辑的内容无法保存。

  1. <html>
  2. <head>
  3. <style>
  4. #editor {
  5. border: 1px solid black;
  6. height: 250px;
  7. margin: 15px;
  8. padding: 10px;
  9. overflow: scroll;
  10. }
  11. </style>
  12. <script type=“text/javascript”>
  13. function load() {
  14. var finput = document.getElementById(“data”);
  15. var editor = document.getElementById(“editor”);
  16. var f = finput.files[0];
  17. if (f) {
  18. var r = new FileReader();
  19. r.onload = function(e) { editor.innerHTML = e.target.result }
  20. r.readAsText(f);
  21. } else { editor.innerHTML = “Failed to load file” }
  22. }
  23. function format(c) { document.execCommand(c, false, false); }
  24. </script>
  25. </head>
  26. <body>
  27. <h3>HTML File Reader Test</h3>
  28. <p>Select a file:
  29. <input type=“file” id=“data” />
  30. <a href=“#” onclick=“load()”>Load</a>
  31. </p>
  32. <p>
  33. <a href=“#” onclick=“format(‘bold’)”>Bold</a>
  34. <a href=“#” onclick=“format(‘italic’)”>Italic</a>
  35. <a href=“#” onclick=“format(‘underline’)”>Underline</a>
  36. </p>
  37. <div id=“editor” contentEditable=“true”></div>
  38. </body>
  39. </html>

随着 JavaScript 引擎的效率在各大浏览器的显著提高,JavaScript 可以做越来越多的事,本地文件 API 的引入将让很多有趣的功能成为现实。尽管该 API 并非多么重大的技术革命,但它将拓展 Web 应用的视野,让 Web 平台实现越来越多的功能。

转载请标注编辑来源:新 API 寻求让 JavaScript 操作本地文件

英文原文来源  查看中文来源   我想网 板凳 编辑

Tags:

分享
QQ书签
百度搜藏
Del.icio.us
Google书签
和讯网摘
天极网摘

回复已关闭.