我试图通过创建一个函数来实现一个简单的文本文件阅读器,该函数接受文件的路径并将每行文本转换为字符数组,但它不起作用。

function readTextFile() {
  var rawFile = new XMLHttpRequest();
  rawFile.open("GET", "testing.txt", true);
  rawFile.onreadystatechange = function() {
    if (rawFile.readyState === 4) {
      var allText = rawFile.responseText;
      document.getElementById("textSection").innerHTML = allText;
    }
  }
  rawFile.send();
}

这里出了什么问题?

这似乎仍然不工作后,改变了代码一点点从以前的修订,现在它给我一个XMLHttpRequest异常101。

我已经在Firefox上测试过了,它可以工作,但在谷歌Chrome中,它不会工作,它一直给我一个101例外。我怎么能让它不仅在Firefox上工作,而且在其他浏览器(尤其是Chrome)上工作?


当前回答

function readTextFile(file) {
    var rawFile = new XMLHttpRequest(); // XMLHttpRequest (often abbreviated as XHR) is a browser object accessible in JavaScript that provides data in XML, JSON, but also HTML format, or even a simple text using HTTP requests.
    rawFile.open("GET", file, false); // open with method GET the file with the link file ,  false (synchronous)
    rawFile.onreadystatechange = function ()
    {
        if(rawFile.readyState === 4) // readyState = 4: request finished and response is ready
        {
            if(rawFile.status === 200) // status 200: "OK"
            {
                var allText = rawFile.responseText; //  Returns the response data as a string
                console.log(allText); // display text on the console
            }
        }
    }
    rawFile.send(null); //Sends the request to the server Used for GET requests with param null
}

readTextFile("text.txt"); //<= Call function ===== don't need "file:///..." just the path 

-从javascript读取文件文本 -控制台日志文本从文件使用javascript -谷歌chrome和mozilla firefox在我的情况下,我有这样的文件结构:

console.log结果:

其他回答

您需要检查状态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);
}

在你的文件名中指定file://:

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

由于同源策略的原因,Chrome不支持本地AJAX调用。

chrome上的错误信息是这样的: “跨源请求不支持协议方案:http, data, chrome, chrome-extension, https。”

这意味着chrome为每个域创建一个虚拟磁盘,以保存使用http/https协议的域提供的文件。对该虚拟磁盘以外的任何文件的访问都受到同源策略的限制。AJAX请求和响应发生在http/https上,因此不适用于本地文件。

Firefox没有这样的限制,因此您的代码可以在Firefox上愉快地工作。然而,铬也有变通办法:请看这里。

使用Fetch和async函数

const logFileText = async file => {
    const response = await fetch(file)
    const text = await response.text()
    console.log(text)
}

logFileText('file.txt')

这是一个老问题,但有两个主要观点我们必须弄清楚。我们是想读取整个文件还是逐行获取?

泰欧,我想要完整的文件然后再处理。

好的,这很简单,我们只需调用text(记住,text假设文件是UTF-8编码的),并像这样处理文件:

const $output = document.getElementById('output') const $file = document.getElementById('file') const fetchFile = async e => { Const [file] = e.target.files Const text = await file.text() 美元输出。textContent = text } 美元的文件。onchange = fetchFile <input id='file' type='file' accept='text/plain'><br> < pre id =“输出”>…< / >之前

那一行一行呢?这是可能的?

好吧,我的小徒弟,这也是可能的我们只需要像这样把文本分成几行

const $output = document.getElementById('output') const $file = document.getElementById('file') 让数 const fetchFile = async e => { Const [file] = e.target.files If (!file)返回 计数= 0 Const text = await file.text() 美元输出。textContent = text Const lines = text.split(/\r?\n/gm) For (const line of lines) { 如果(行)计数++ } console.log({数}) } 美元的文件。onchange = fetchFile <input id='file' type='file' accept='text/plain'><br> < pre id =“输出”>…< / >之前

var input = document.getElementById("myFile"); var output = document.getElementById("output"); input.addEventListener("change", function () { if (this.files && this.files[0]) { var myFile = this.files[0]; var reader = new FileReader(); reader.addEventListener('load', function (e) { output.textContent = e.target.result; }); reader.readAsBinaryString(myFile); } }); <input type="file" id="myFile"> <hr> <textarea style="width:500px;height: 400px" id="output"></textarea>