1

我在服务器端有一堆文本文件,文件名为 0.txt、1.txt、2.txt、3.txt 等等。我想读取所有文件的内容并将它们存储在数组 A 中,这样 A[0] 有 0.txt 的内容,A[1] 有 1.txt 的内容,...

我怎样才能在 Javascript / jquery 中做到这一点?

最初,我在 jQuery 中使用 $.ajax({}) 来加载这些文本文件。但它不起作用,因为 ajax 的异步特性。我尝试设置 $.ajax({...async=false...}),但速度很慢——我总共要读取大约 1000 个 10KB 的文件。

4

3 回答 3

1

您正在寻找的是HTML5 中引入的File API (工作草案)。

本文中的示例将为您指明正确的方向。请记住,最终用户必须启动操作并手动选择文件 - 否则在隐私和安全方面将是一个糟糕的想法。

更新:

我发现(又一次)mozilla docos更具可读性!快速 html 样机:

<input type="file" id="files" name="files[]" onchange="loadTextFile();" multiple/>
<button id="test"onclick="test();">What have we read?</button>

...和 ​​JavaScript:

var testArray = []; //your array

function loadTextFile() {
  //this would be tidier with jQuery, but whatever
  var _filesContainer = document.getElementById("files");
  //check how many files have been selected and iterate over them
  var _filesCount = _filesContainer.files.length;
  for (var i = 0; i < _filesCount; i++) {
    //create new FileReader instance; I have to read more into it
    //but I was unable to just recycle one
    var oFReader = new FileReader();

    //when the file has been "read" by the FileReader locally
    //log its contents and push them into an array
    oFReader.onload = function(oFREvent) {
      console.log(oFREvent.target.result);
      testArray.push(oFREvent.target.result);
    };

    //actually initiate the read
    oFReader.readAsText(_filesContainer.files[i]);
  }
}

//sanity check
function test() {
  for (var i = 0; i < testArray.length; i++) {
    console.warn(testArray[i]);
  }
}​

摆弄

于 2012-09-16T01:51:58.323 回答
1

根据您的问题,您想将 txt 文件从服务器加载到本地:

var done = 0, resultArr = [], numberOfFiles = 1000;

function getHandler(idx) {
    return function(data) {
        resultArr[idx] = data;
        done++;
        if (done === numberOfFiles) {
            // tell your other part all files are loaded
        }
    }
}

for (var i = 0; i < numberOfFiles; i++) {
    $.ajax(i + ".txt").done(getHandler(i));
}

jsFiddle:http: //jsfiddle.net/LtQYF/1/

于 2012-09-16T02:48:06.667 回答
-1

您没有提供太多信息来给出具体答案。但是,我认为“由于 ajax 的异步性质,它不起作用”是不正确的。您应该能够分配正确大小的数组并为每个文件使用回调。您可以尝试其他选项,例如在服务器上捆绑文件并在客户端上取消捆绑等。能够很好地解决问题的设计取决于您未提供的细节。

于 2012-09-16T02:09:56.677 回答