如何使用JavaScript从服务器读取文本文件?

43
在服务器上有一个文本文件。使用客户端上的JavaScript,我想能够读取并处理该文件。服务器上的文件格式无法更改。
如何将文件内容获取到JavaScript变量中,以便进行处理?文件的大小可以高达3.5 MB,但可以轻松地分块处理,例如每次处理100行(1行为50-100个字符)。
文件的任何内容都不应对用户可见;他将看到数据处理的结果。
8个回答

40
你可以使用隐藏框架,在其中加载文件并解析其内容。
HTML:
<iframe id="frmFile" src="test.txt" onload="LoadFile();" style="display: none;"></iframe>

JavaScript:

<script type="text/javascript">
function LoadFile() {
    var oFrame = document.getElementById("frmFile");
    var strRawContents = oFrame.contentWindow.document.body.childNodes[0].innerHTML;
    while (strRawContents.indexOf("\r") >= 0)
        strRawContents = strRawContents.replace("\r", "");
    var arrLines = strRawContents.split("\n");
    alert("File " + oFrame.src + " has " + arrLines.length + " lines");
    for (var i = 0; i < arrLines.length; i++) {
        var curLine = arrLines[i];
        alert("Line #" + (i + 1) + " is: '" + curLine + "'");
    }
}
</script>

注意:为了在 Chrome 浏览器中正常工作,您应该使用 --allow-file-access-from-files 标志启动它。来源


1
太棒了!我本以为从同一服务器目录加载一个简单的文本文件会让我发疯。 - user574171
谢谢,从那时起我也迷上了jQuery,但这个技巧仍然有效。 :) - Shadow The Spring Wizard
对于特殊情况,您必须从文件系统加载文件(您的HTML不是由Web服务器提供而是直接从文件系统提供),您可能会遇到iframe问题,请参见https://dev59.com/9WMl5IYBdhLWcg3w_rOD#20379650。至少我在Chrome上遇到了这个问题。对于Firefox,它可以正常工作。 - rwitzel
@rwitzel 当然,这里的问题显然是关于从服务器读取数据,通常意味着实际的Web服务器。 - Shadow The Spring Wizard
1
为了在Chrome中加载file:/// URL,我必须使用--allow-file-access-from-files启动Chrome。 - EM0

15

加载大量数据并非明智之举,但如果你必须这样做,那么使用 jQuery 的 $.ajax() 函数可能是一种方案。

<html><head>
<script src="jquery.js"></script>
<script>
getTxt = function (){

  $.ajax({
    url:'text.txt',
    success: function (data){
      //parse your data here
      //you can split into lines using data.split('\n') 
      //an use regex functions to effectively parse it
    }
  });
}
</script>
</head><body>
  <button type="button" id="btnGetTxt" onclick="getTxt()">Get Text</button>
</body></html>

10

您需要使用Ajax,它基本上是向服务器发送请求,然后获取JSON对象,将其转换为JavaScript对象。

请检查以下内容:

http://www.w3schools.com/ajax/tryit.asp?filename=tryajax_first

如果您正在使用jQuery库,它会更加容易:

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

说了这么多,我强烈建议您不要将一个3.5MB的文件下载到JS中!这不是一个好主意。在服务器上进行处理,然后在处理后返回数据。然后,如果您想获取新数据,请发送新的Ajax请求,在服务器上处理请求,然后返回新数据。

希望这有所帮助。


1
OP似乎只用JavaScript说了“only” :) - Sarfraz
4
是的,Ajax是一种技术而不是一种语言,因此我的答案仍然只使用JavaScript :-) - Rafid
1
我在哪里说它是一种语言了,但对于Ajax,你仍然需要服务器端语言 :) - Sarfraz
6
对于Ajax,你无需使用服务器端语言!Ajax很简单,它只加载文本文件。如果你有一些不是普通文本文件的内容,那么你就需要使用服务器端语言将其转换为JSON、XML、逗号分隔文本或简单字符串等普通文本格式。但由于原帖中确实是一个文本文件,所以他只需要确保能够从他的 Web 服务器访问到它即可。但仍然不建议加载一个 3.5 MB 的文件。 - slebetman
@slebetman 嗯,实际上 AJAX 无法连接到 MySQL 数据库,但这只是因为没有一个理智的人会与客户共享数据库凭据。如果这不是一个问题,AJAX 肯定会有这样的功能。 - Neurotransmitter
显示剩余7条评论

8

我采用了Rafid的建议,使用了AJAX。

这对我很有用:

var url = "http://www.example.com/file.json";

var jsonFile = new XMLHttpRequest();
    jsonFile.open("GET",url,true);
    jsonFile.send();

    jsonFile.onreadystatechange = function() {
        if (jsonFile.readyState== 4 && jsonFile.status == 200) {
            document.getElementById("id-of-element").innerHTML = jsonFile.responseText;
        }
     }

我基本上(几乎完全)是从http://www.w3schools.com/ajax/tryit.asp?filename=tryajax_get2复制了这段代码,所以所有的功劳归他们所有。
虽然我对这个的工作原理不是很了解,但是你不需要知道你的刹车是如何工作的,就能使用它们 ;)
希望这有所帮助!

5

看起来XMLHttpRequest已经被Fetch API所取代。谷歌发布了一篇很好的入门介绍,其中包含了一个实现你所需功能的例子:

fetch('./api/some.json')
  .then(
    function(response) {
      if (response.status !== 200) {
        console.log('Looks like there was a problem. Status Code: ' +
          response.status);
        return;
      }

      // Examine the text in the response
      response.json().then(function(data) {
        console.log(data);
      });
    }
  )
  .catch(function(err) {
    console.log('Fetch Error :-S', err);
  });

然而,你可能想调用response.text()而不是response.json()


2

有一个小细节,我看到一些答案使用了innerhtml。我曾经考虑过类似的想法,但最终决定不这样做,在最新版本的React中,同样的过程现在被称为dangerouslyinnerhtml,因为你通过在应用程序中呈现HTML来向客户端提供了进入操作系统的途径。这可能会导致各种攻击以及SQL注入尝试。


1
你需要检查状态码是否为0(当使用XMLHttpRequest本地加载文件时,你无法获取状态码,而从Web服务器获取时会返回状态码)。
function readTextFile(file) {
var rawFile = new XMLHttpRequest();
rawFile.open("GET", file, false);
rawFile.onreadystatechange = function ()
{
    if(rawFile.readyState === 4)
    {
        if(rawFile.status === 200 || rawFile.status == 0)
        {
            var allText = rawFile.responseText;
            alert(allText);
        }
    }
}
rawFile.send(null);
}

要进行设备文件读取,请使用以下内容:

readTextFile("file:///C:/your/path/to/file.txt");

要从服务器读取文件,请使用:

readTextFile("http://test/file.txt");

AJAX能读取私有服务器文件吗,还是必须使用AJAX+PHP来读取私有文件? - Brethlosze

0

我真的认为你的方法是错误的。试图下载和解析一个超过3MB的文本文件是完全疯狂的。为什么不在服务器端解析文件,使用ORM将结果存储到数据库中(你可以选择SQL,但也取决于内容键值数据更适合像CouchDB这样的东西),然后使用ajax在客户端解析数据。

此外,如果可能的话,甚至更好的想法是完全跳过文本文件以获得更好的性能。


2
我在解读这个答案的初始段落时遇到了很多麻烦,但我认为我已经理解了要点。请注意,提问者说:“服务器上文件的格式不能更改。” 这就是这个问题有趣的原因。如果您更改问题以允许大量服务器端技术,则它不再是一个有趣的问题,而您的答案(也不是有趣的)只是众多潜在解决方案之一。 - sowbug

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