关于javascript:如何读取本地文本文件?

How to read a local text file?

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

1
2
3
4
5
6
7
8
9
10
11
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)上运行 )?


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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://

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


访问Javascripture!然后进入readAsText部分并尝试示例。您将能够知道FileReader的readAsText函数如何工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    <html>
    <head>
   
      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]);
      };
   
    </head>
    <body>
    <input type='file' accept='text/plain' onchange='openFile(event)'>
   
    ...
   
    </body>
    </html>


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

读取文本文件

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

读取json文件

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

更新30/07/2018(免责声明):

This technique works fine in Firefox, but it seems like Chrome's fetch implementation does not support file:/// URL scheme at the date of writing this update (tested in Chrome 68).


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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);
  }  
});
1
2
3
<input type="file" id="myFile">

<textarea style="width:500px;height: 400px" id="output"></textarea>


乔恩·佩里曼

是的,js可以读取本地文件(请参阅FileReader()),但不能自动读取:用户必须使用html 将文件或文件列表传递给脚本。

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

出于安全原因,js无法执行的操作是自动(无需用户输入)访问其计算机的文件系统。

要允许js自动访问本地fs,需要创建一个不在其中的带有js的html文件,而是创建一个hta文档。

hta文件中可以包含js或vb。

但是hta可执行文件仅适用于Windows系统。

这是标准的浏览器行为。

谷歌浏览器也在fs api上工作,更多信息请参见:http://www.html5rocks.com/en/tutorials/file/filesystem/


可能您已经尝试过,键入" false",如下所示:

1
 rawFile.open("GET", file, false);


尝试创建两个函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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"
" is splitting data from each new line
   //and saving each new line as each element*

   var lineArr = lines.split('
');

   //just to check if it works output lineArr[index] as below
   document.write(lineArr[2]);        
   document.write(lineArr[3]);
}


另一个例子-我的FileReader类的阅读器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<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 src="http://code.jquery.com/ui/1.11.3/jquery-ui.js">
    </head>
    <body>
       
            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
            });
        });
       
        <object width="100%" height="400" data="" id="obj"></object>
       
            <input type="hidden" id="uploadTextValue" name="uploadTextValue" value="" />
            <input id="uploadText" style="width:120px" type="file" size="10"  onchange="PreviewText();" />
       
        Source file
    </body>
</html>


这可能会有所帮助,

1
2
3
4
5
6
7
8
9
10
    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();

使用提取和异步功能

1
2
3
4
5
6
7
const logFileText = async file => {
    const response = await fetch(file)
    const text = await response.text()
    console.log(text)
}

logFileText('file.txt')


除了上述答案外,此修改后的解决方案对我也有效。

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

....

1
2
3
4
5
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]);

....

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);
            }
        }
    }    
}


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

如果您查看控制台日志,则会发现" Cross origin requests are not supported for protocol schemes: http, data, chrome, chrome-extension, https."

这表示Chrome浏览器会为每个域创建一种虚拟磁盘,该域通过上述列出的协议提供的文件存储在该磁盘中,在本地磁盘上访问该磁盘之外的文件受同一原始策略的限制。 AJAX请求和响应发生在http / https上,因此不适用于本地文件。

Firefox没有设置此类限制,因此您的代码可以在Firefox上愉快地工作。但是,Chrome也有解决方法:请参见此处。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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具有以下文件结构:enter image description here

console.log结果:enter image description here


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<html>
<head>
   
    <meta charset="utf-8" />
    <script src="https://code.jquery.com/jquery-1.10.2.js">
    <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('
'
);
                            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'));
                });
        });
   
</head>
<body>
   
        <input type="checkbox" id="ckbCheckAll" class="checkBoxClass"/> Select All<br />        
   
</body>
</html>

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

1
2
3
4
5
6
7
8
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
   if (xmlhttp.readyState == 4) {
       var allText = xmlhttp.responseText;          
            }
        };
xmlhttp.open("GET", file, false);
xmlhttp.send(null);

您可以导入我的库:

1
<script src="https://www.editeyusercontent.com/preview/1c_hhRGD3bhwOtWwfBD8QofW9rD3T1kbe/[email protected]">

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

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

请注意:在Google Chrome上,如果HTML代码是本地代码,则会出现错误,但可以先保存HTML代码和文件,然后再运行在线HTML文件。


如何读取本地文件?

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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');

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function loadMyFile(){
    console.log("ut:"+unixTimeSec());
    loadScript("data.js?"+unixTimeSec(), loadParse);
}
function loadParse(){
    var mA_=mSdata.split("
"
);
    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(/^[^\/]+\/\*![^

]*[

]*/,"").
      replace(/[

][^

]*\*\/[^\/]+$/,"");
}
function unixTimeSec(){
    return Math.round( (new Date()).getTime()/1000);
}

data.js文件,例如:

1
2
3
4
5
6
7
8
var mSdata = hereDoc(function() {/*!
17,399
1237,399
BLAHBLAH
BLAHBLAH
155,82
194,376
*/
});

动态unixTime queryString防止缓存。

AJ在网站http://中工作。