Javascript,如何读取本地文件?

时间:2011-06-28 12:39:20

标签: javascript

我尝试从服务器读取本地文件。我一直在“谷歌搜索”这个话题已有一段时间了,有些人说这是不可能的,有些人则说可以做到。在此搜索过程中,我找到了这个脚本:

  

使用xmlhttprequest

读取文件      

如果您的javascript应用的HTML文件已保存到磁盘,   这是一种读取数据文件的简便方法。写出是   更复杂,需要一个ActiveX对象(IE)   或XPCOM(Mozilla)。

     

fname - 文件的相对路径

     

回调 - 使用文件文本调用的函数

function readFileHttp(fname, callback) {

    xmlhttp = getXmlHttp();

    xmlhttp.onreadystatechange = function() {

        if (xmlhttp.readyState==4) { 

            callback(xmlhttp.responseText); 

        }

    }

    xmlhttp.open("GET", fname, true);

    xmlhttp.send(null);

}
  

返回跨浏览器的xmlhttp请求对象

function getXmlHttp() {

    if (window.XMLHttpRequest) {

        xmlhttp=new XMLHttpRequest();

    } else if (window.ActiveXObject) {
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

    }

    if (xmlhttp == null) {

        alert("Your browser does not support XMLHTTP.");

    }

    return xmlhttp;

}

但我不知道如何使用它,回调函数应该怎么样?你能用这些函数提供一个示例代码吗?

5 个答案:

答案 0 :(得分:4)

能够从您的浏览器中读取本地文件将是一个重大的安全漏洞 - 我不喜欢我访问的任何网站的想法能够在我的浏览器中运行代码从我的硬盘读取文件。通常,ajax请求仅限于页面所源自的域。 (但是,您可以使用JSONP等技术在某种程度上解决这个问题。)即使页面来自本地文件系统,大多数浏览器也不会让您读取本地文件。

提到的其他方法应该允许您从域中读取文件(即使它是localhost),但不能直接从文件系统中读取文件。

答案 1 :(得分:2)

使用javascript,您只能读取服务器上公开的文件。它类似于在浏览器中打开它...

我建议使用jQuery库来执行此操作,所有主流浏览器都更容易使用ajax请求:

http://api.jquery.com/jQuery.get/

例如,你可以这样做:

$.get('/content/test.html', function(data) {
  alert(data);
});

答案 2 :(得分:2)

在下面找到activeX脚本来读取本地文件。 (在IE中工作正常)。

    var fso = new ActiveXObject("Scripting.FileSystemObject");
    //specify the local path to Open
    var file = fso.OpenTextFile("C:\\your path\\ filename", 1);
    var fileContent = file.ReadAll();
    file.Close();

    //Parse the contents
    // ex: if the content is in JSON format
    var obj = eval('(' + fileContent+ ')');

    for (var i = 0; i < obj.length; i++) {
        //Access each element
        alert(obj[i].name);
    }

答案 3 :(得分:2)

以下代码将浏览文件并将内容复制到textarea:

   <input type="file" id="fileinput" />
    <script type="text/javascript">
      function readSingleFile(evt) {
        //Retrieve the first (and only!) File from the FileList object
        var f = evt.target.files[0]; 

        if (f) {
          var r = new FileReader();
          r.onload = function(e) { 
              var contents = e.target.result;
            alert( "Got the file.\n" 
                  +"name: " + f.name + "\n"
                  +"type: " + f.type + "\n"
                  +"size: " + f.size + " bytes\n"
                  + "starts with: " + contents.substr(1, contents.indexOf("\n"))
            );  
            document.getElementById('area').value=  contents;
          }
          r.readAsText(f);

        } else { 
          alert("Failed to load file");
        }
      }

      document.getElementById('fileinput').addEventListener('change', readSingleFile, false);
    </script>

    <textarea rows=20 id="area"></textarea>

答案 4 :(得分:0)

作为回调传入的函数应该包含实际处理初始ajax调用结果的代码。例如,最简单的:

alert("RESPONSE: " + xmlhttp.responseText;

但是,我们需要澄清您要做的事情:读取存储在服务器上的文件?如果是这样,那么必须从网络上访问该目标文件(以便您可以将其URL传递给您的ajax调用),否则您的代码将无法正常工作。