JavaScript从当前目录读取文本文件

4
如何使用JavaScript而不是jQuery从当前目录中读取文本文件(text1.txt)。我尝试了以下代码。
var file = "text1.txt";
var reader = new FileReader();
var result = reader.readAsText(file);
console.log(result);

2
什么是当前目录? - Arun P Johny
1
用户必须先将文件“上传”到页面上,然后才能选择它。未经用户同意,您无法访问文件。或者文件在您的服务器上?那么您需要使用Ajax,而不是FileReader。 - JJJ
查看API文档,这是一个异步操作。只有在加载完成后,您的“result”才会有效。https://developer.mozilla.org/en-US/docs/DOM/FileReader#readAsText%28%29 - Thilo
以上代码的结果是未定义的。不是用户上传的文件。它是一个文本文件,与我的HTML文件和JavaScript文件一起存放在一个公共文件目录中。 - kklw
4个回答

8

FileReader API通常用于读取通过<input type="file">选中的文件。它无法读取任意文件。 readAsText方法期望接收Blob或File对象,而不是包含文件名的字符串。

要读取与HTML文档同级的文件,请使用XMLHttpRequest。如果您通过HTTP(S)加载文档,则这样做将可靠地工作。如果您使用本地HTML文档(通过file:URI),那么许多浏览器中的安全限制将防止其工作(您应该使用本地Web服务器代替)。


4

方案A,您的用例不允许使用http或php服务器。 您可以使用脚本包含将本地内容作为变量包含在javascript中。 如果您正在从目录中以文件形式本地打开页面,则这是包含本地内容的唯一方法。

要包含本地内容,请将以下内容放在其他脚本标记之上:

<script src="text1.txt"></script>

并编辑您的text1.txt文件,使其将所有内容分配给一个变量:

gbl_text=`...contents of my text file...
...more contents...
...and so on....   
`

您可以使用脚本来创建此包含文件,例如(使用下面波浪线~键下的 ` 键):
echo -n "var gbl_text=\`" > text1.txt
cat your-original-file.txt >> text1.txt
echo "\`" >> text1.txt

然后根据需要在你的javascript中使用gbl_text变量...
function dosomething()
{
  if (typeof(gbl_text)=='undefined'){
    setTimeout('dosomething()',500)  //call back until defined
  }else{
    console.log(gbl_text)
  }
}

选项 B,您的使用情况可以使用php-cli内置服务器。 如果您能够运行php-cli,则可以在内置的php Web服务器上打开页面,并通过php调用读写本地内容。要在Linux上安装和使用php,

sudo apt install php7.0-cli
#To use the php built-in webserver, run:
php -S localhost:8000 -t /path/to/your/content

因此,您需要将HTML文件作为HTTP网页打开,而不是作为文件打开:
firefox http://localhost:8000/mypage.html
#or browser of choice

现在,本地网页正在通过一个实际的(本地)http服务器提供服务,并且您可以使用它来操作本地文件。

这里有一个简单的示例,展示如何使用jQuery和php读写本地文件。请下载并在您的html文件中包含jQuery(请参见jQuery.com)。

dofile.php的内容:

<?php 
$dowhat  = $_REQUEST['dowhat'];
  if ($dowhat=='save'){
    $myvar = $_REQUEST['myvar'];
    file_put_contents('myfile', $myvar); 
  }elseif($dowhat=='read'){
    $myvar=file_get_contents('myfile');
    echo $myvar; 
  }
?> 

我的页面.html的内容:

<script src='jquery-3.2.1.js';></script>
<!--make sure the filename matches the jQuery you use-->

<script>
function savevar(){
  var myvar=document.getElementById('mytxt').value
  var path="dofile.php?dowhat=save&myvar="+myvar 
  $.get(path, function(data){
    console.log("saved ...\n"+myvar)
    alert("saved ...\n"+myvar)
  });
}

function clearbox(){
  document.getElementById('mytxt').value='reading file...'
  setTimeout('getvar()',1000)
}

function getvar(){
  var path="dofile.php?dowhat=read"
  $.get(path, function(data){
    console.log(data);
    document.getElementById('mytxt').value=data
    /*do other things with data here*/;
  });
}
</script>

<html>
Type something in the text box.<br>
Use the Read and Write buttons to verify <br>
text is saved and read back.<br> 
<input id='mytxt' value='type text here' onclick=document.getElementById('mytxt').value=''><br>
<input type='button' value='Save' onclick=savevar() ><input type='button' value='Read' onclick=clearbox() >

</html>

谢谢。这对我的几个页面有所帮助,但现在我需要弄清楚如何使脚本源变量,通过本地存储传递给新页面。 - M610
我已经重写了答案,以澄清几种在HTML文档中包含本地文件的方法。如果有人知道这是为什么被踩的,请留言,我会尽力改进答案。由于浏览器的安全限制,只有很少的几种方法可以引入本地内容。另一种方法可能是使用Python和webkit,但除非有人愿意给这个答案点赞,否则我不想发布更多信息。 - Ken H

0
请区分两种读取文件的方式:
  • 从互联网上读取 - 使用 XMLHttpRequest 读取任何类型的文件
  • 从客户端读取 - 使用 FileReader 或 <input type="file">

0
创建一个小的iframe。 在那里加载文件。 使用iframe.innerHTML读取它。

1
请简要描述您的问题,附上代码。 - Rahul Shukla

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