472

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

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 上对此进行了测试,它可以工作,但是在 Google Chrome 中它不起作用,并且它一直给我一个异常 101。我怎样才能让它不仅适用于 Firefox,而且适用于其他浏览器(尤其是 Chrome )?

4

22 回答 22

373

您需要检查状态 0(当使用 本地加载文件时XMLHttpRequest,您不会收到返回的状态,因为它不是来自 a Webserver

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");
于 2013-01-21T20:20:34.627 回答
161

在 javascript中引入fetch api后,读取文件内容再简单不过了。

读取文本文件

fetch('file.txt')
  .then(response => response.text())
  .then(text => console.log(text))
  // outputs the content of the text file

读取一个 json 文件

fetch('file.json')
  .then(response => response.json())
  .then(jsonResponse => console.log(jsonResponse))     
   // outputs a javascript object from the parsed json

2018 年 7 月 30 日更新(免责声明):

这种技术在Firefox中运行良好,但在编写此更新时Chromefetch实现似乎不支持URL 方案(在 Chrome 68 中测试)。file:///

更新 2(免责声明):

出于与 Chrome 相同的(安全)原因,此技术不适用于 68 版(2019 年 7 月 9 日)以上的FirefoxCORS request not HTTP:. 请参阅https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/CORSRequestNotHttp

于 2017-09-09T09:42:23.633 回答
122

访问Javascripture!并转到readAsText部分并尝试该示例。您将能够知道FileReader的readAsText函数是如何工作的。

    <html>
    <head>
    <script>
      var openFile = function(event) {
        var input = event.target;

        var reader = new FileReader();
        reader.onload = function(){
          var text = reader.result;
          var node = document.getElementById('output');
          node.innerText = text;
          console.log(reader.result.substring(0, 200));
        };
        reader.readAsText(input.files[0]);
      };
    </script>
    </head>
    <body>
    <input type='file' accept='text/plain' onchange='openFile(event)'><br>
    <div id='output'>
    ...
    </div>
    </body>
    </html>
于 2015-03-20T21:30:38.287 回答
55

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>

于 2017-08-22T10:46:37.463 回答
31

是的,JS 可以读取本地文件(参见 FileReader()),但不能自动读取:用户必须使用 html 将文件或文件列表传递给脚本<input type="file">

然后使用 JS 可以处理(示例视图)文件或文件列表、它们的一些属性以及文件或文件内容。

出于安全原因,JS 不能做的是自动(无需用户输入)访问他计算机的文件系统。

要让 JS 自动访问本地 fs,需要创建的不是其中包含 JS 的 html 文件,而是一个 hta 文档。

hta 文件中可以包含 JS 或 VBS。

但是 hta 可执行文件只能在 Windows 系统上运行。

这是标准的浏览器行为。

Google Chrome 也在 fs API 工作,更多信息在这里:http ://www.html5rocks.com/en/tutorials/file/filesystem/

于 2016-01-29T03:31:48.963 回答
29

现代解决方案:

使用fileOrBlob.text()如下:

<input type="file" onchange="this.files[0].text().then(t => console.log(t))">

当用户通过该输入上传文本文件时,它将被记录到控制台。这是一个有效的 jsbin 演示

这是一个更详细的版本:

<input type="file" onchange="loadFile(this.files[0])">
<script>
  async function loadFile(file) {
    let text = await file.text();
    console.log(text);
  }
</script>

目前(2020 年 1 月)这仅适用于 Chrome 和 Firefox,如果您将来阅读此内容,请在此处查看兼容性:https ://developer.mozilla.org/en-US/docs/Web/API/Blob/text

在较旧的浏览器上,这应该可以工作:

<input type="file" onchange="loadFile(this.files[0])">
<script>
  async function loadFile(file) {
    let text = await (new Response(file)).text();
    console.log(text);
  }
</script>

相关:截至 2020 年 9 月,Chrome 和 Edge 中提供了新的本机文件系统 API,以防您希望对用户选择的文件进行永久读取访问(甚至写入访问)。

于 2020-01-18T20:06:32.153 回答
13

使用Fetch和 async 函数

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

logFileText('file.txt')
于 2019-01-08T13:15:36.103 回答
12

尝试创建两个函数:

function getData(){       //this will read file and send information to other function
       var xmlhttp;

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

       xmlhttp.onreadystatechange = function () {               
           if (xmlhttp.readyState == 4) {                   
             var lines = xmlhttp.responseText;    //*here we get all lines from text file*

             intoArray(lines);     *//here we call function with parameter "lines*"                   
           }               
       }

       xmlhttp.open("GET", "motsim1.txt", true);
       xmlhttp.send();    
}

function intoArray (lines) {
   // splitting all text data into array "\n" is splitting data from each new line
   //and saving each new line as each element*

   var lineArr = lines.split('\n'); 

   //just to check if it works output lineArr[index] as below
   document.write(lineArr[2]);         
   document.write(lineArr[3]);
}
于 2013-10-16T23:29:49.393 回答
12

可以证明你已经尝试过了,输入“false”如下:

 rawFile.open("GET", file, false);
于 2013-11-26T12:17:57.240 回答
11

其他示例-我的带有 FileReader 类的阅读器

<html>
    <head>
        <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.3/themes/smoothness/jquery-ui.css">
        <script src="http://code.jquery.com/jquery-1.10.2.js"></script>
        <script src="http://code.jquery.com/ui/1.11.3/jquery-ui.js"></script>
    </head>
    <body>
        <script>
            function PreviewText() {
            var oFReader = new FileReader();
            oFReader.readAsDataURL(document.getElementById("uploadText").files[0]);
            oFReader.onload = function (oFREvent) {
                document.getElementById("uploadTextValue").value = oFREvent.target.result; 
                document.getElementById("obj").data = oFREvent.target.result;
            };
        };
        jQuery(document).ready(function(){
            $('#viewSource').click(function ()
            {
                var text = $('#uploadTextValue').val();
                alert(text);
                //here ajax
            });
        });
        </script>
        <object width="100%" height="400" data="" id="obj"></object>
        <div>
            <input type="hidden" id="uploadTextValue" name="uploadTextValue" value="" />
            <input id="uploadText" style="width:120px" type="file" size="10"  onchange="PreviewText();" />
        </div>
        <a href="#" id="viewSource">Source file</a>
    </body>
</html>
于 2015-02-19T15:35:07.340 回答
5

这可能会有所帮助,

    var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            alert(xmlhttp.responseText);
        }
    }

    xmlhttp.open("GET", "sample.txt", true);
    xmlhttp.send();
于 2016-11-18T15:20:44.283 回答
3

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

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

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

Firefox 没有这样的限制,因此您的代码可以在 Firefox 上正常运行。但是也有针对 chrome 的解决方法:请参见此处

于 2018-12-26T12:12:08.727 回答
2

除了上面的一些答案,这个修改后的解决方案对我有用。

<input id="file-upload-input" type="file" class="form-control" accept="*" />

……

let fileInput  = document.getElementById('file-upload-input');
let files = fileInput.files;

//Use createObjectURL, this should address any CORS issues.
let filePath = URL.createObjectURL(files[0]);

……

function readTextFile(filePath){
    var rawFile = new XMLHttpRequest();
    rawFile.open("GET", filePath , true);
    rawFile.send(null);

    rawFile.onreadystatechange = function (){
        if(rawFile.readyState === 4){
            if(rawFile.status === 200 || rawFile.status == 0){
                var allText = rawFile.responseText;
                console.log(allText);
            }
        }
    }     
}
于 2018-12-31T19:50:50.363 回答
2
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 从文件中读取控制台日志文本
- 在我的情况下,Google chrome 和 mozilla firefox

我有以下文件结构:在此处输入图像描述

console.log 结果:
在此处输入图像描述

于 2019-01-18T09:38:37.693 回答
1
<html>
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="https://code.jquery.com/jquery-1.10.2.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {            
                $.ajax({`enter code here`
                    url: "TextFile.txt",
                    dataType: "text",
                    success: function (data) {                 
                            var text = $('#newCheckText').val();
                            var str = data;
                            var str_array = str.split('\n');
                            for (var i = 0; i < str_array.length; i++) {
                                // Trim the excess whitespace.
                                str_array[i] = str_array[i].replace(/^\s*/, "").replace(/\s*$/, "");
                                // Add additional code here, such as:
                                alert(str_array[i]);
                                $('#checkboxes').append('<input type="checkbox"  class="checkBoxClass" /> ' + str_array[i] + '<br />');
                            }
                    }                   
                });
                $("#ckbCheckAll").click(function () {
                    $(".checkBoxClass").prop('checked', $(this).prop('checked'));
                });
        });
    </script>
</head>
<body>
    <div id="checkboxes">
        <input type="checkbox" id="ckbCheckAll" class="checkBoxClass"/> Select All<br />        
    </div>
</body>
</html>
于 2018-02-22T07:41:25.290 回答
1

在 js(data.js) 加载中获取本地文件数据:

function loadMyFile(){
    console.log("ut:"+unixTimeSec());
    loadScript("data.js?"+unixTimeSec(), loadParse);
}
function loadParse(){
    var mA_=mSdata.split("\n");
    console.log(mA_.length);
}
function loadScript(url, callback){

    var script = document.createElement("script")
    script.type = "text/javascript";

    if (script.readyState){  //IE
        script.onreadystatechange = function(){
            if (script.readyState == "loaded" ||
                    script.readyState == "complete"){
                script.onreadystatechange = null;
                callback();
            }
        };
    } else {  //Others
        script.onload = function(){
            callback();
        };
    }

    script.src = url;
    document.getElementsByTagName("head")[0].appendChild(script);
}
function hereDoc(f) {
  return f.toString().
      replace(/^[^\/]+\/\*![^\r\n]*[\r\n]*/, "").
      replace(/[\r\n][^\r\n]*\*\/[^\/]+$/, "");
}
function unixTimeSec(){
    return Math.round( (new Date()).getTime()/1000);
}

data.js 文件,如:

var mSdata = hereDoc(function() {/*!
17,399
1237,399
BLAHBLAH
BLAHBLAH
155,82
194,376
*/});

动态 unixTime queryString 防止缓存。

AJ 在 web http:// 中工作。

于 2019-04-26T05:20:11.653 回答
1

如果要提示用户选择文件,则读取其内容:

// read the contents of a file input
const readInputFile = (inputElement, callback) => {
  const reader = new FileReader();
  reader.onload = () => {
    callback(reader.result)
  };
  reader.readAsText(inputElement.files[0]);
};
// create a file input and destroy it after reading it
export const openFile = (callback) => {
  var el = document.createElement('input');
  el.setAttribute('type', 'file');
  el.style.display = 'none';
  document.body.appendChild(el);
  el.onchange = () => {readInputFile(el, (data) => {
    callback(data)
    document.body.removeChild(el);
  })}
  el.click();
}

用法:

// prompt the user to select a file and read it
openFile(data => {
    console.log(data)
  })
于 2020-12-16T15:13:31.897 回答
0

您可以导入我的库:

<script src="https://www.editeyusercontent.com/preview/1c_hhRGD3bhwOtWwfBD8QofW9rD3T1kbe/code.js?pe=yikuansun2015@gmail.com"></script>

然后,该函数fetchfile(path)将返回上传的文件

<script src="https://www.editeyusercontent.com/preview/1c_hhRGD3bhwOtWwfBD8QofW9rD3T1kbe/code.js"></script>
<script>console.log(fetchfile("file.txt"))</script>

请注意:在谷歌浏览器上,如果 HTML 代码是本地的,则会出现错误,但在线保存 HTML 代码和文件然后运行在线 HTML 文件是可行的。

于 2019-01-03T23:40:13.933 回答
0

为了通过JavaScript使用 chrome 读取本地文件文本,chrome 浏览器应该使用--allow-file-access-from-files允许 JavaScript 访问本地文件的参数运行,然后您可以使用XmlHttpRequest如下方式读取它:

var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
   if (xmlhttp.readyState == 4) {
       var allText = xmlhttp.responseText;          
            }
        };
xmlhttp.open("GET", file, false);
xmlhttp.send(null);
于 2019-01-07T09:56:22.857 回答
0

如何读取本地文件?

通过使用它,您将通过 loadText() 加载文件,然后 JS 将异步等待文件被读取并加载,之后它将执行 readText() 函数,允许您继续正常的 JS 逻辑(您也可以编写 try catch在出现任何错误的情况下阻塞 loadText() 函数),但对于这个示例,我将其保持在最低限度。

async function loadText(url) {
    text = await fetch(url);
    //awaits for text.text() prop 
    //and then sends it to readText()
    readText(await text.text());
}

function readText(text){
    //here you can continue with your JS normal logic
    console.log(text);
}

loadText('test.txt');
于 2019-10-03T13:33:50.557 回答
-1

我知道,我在这个聚会上迟到了。让我告诉你我有什么。

这是一个简单的文本文件读取

var path = "C:\\path\\filename.txt"
var fs = require('fs')
fs.readFile(path , 'utf8', function(err, data) {
  if (err) throw err;
  console.log('OK: ' + filename);
  console.log(data)
});

我希望这有帮助。

于 2020-03-16T09:50:22.143 回答
-1

此函数适用于浏览器和打开文件选择器对话框,在用户选择读取文件作为二进制文件并使用读取数据调用回调函数后:

function pickAndReadFile(callback) {
    var el = document.createElement('input');
    el.setAttribute('type', 'file');
    el.style.display = 'none';
    document.body.appendChild(el);
    el.onchange = function (){
        const reader = new FileReader();
        reader.onload = function () {
            callback(reader.result);
            document.body.removeChild(el);
        };
        reader.readAsBinaryString(el.files[0]);
    }
    el.click();
}

并像这样使用它:

pickAndReadFile(data => {
  console.log(data)
})
于 2021-12-19T08:24:04.000 回答