我正在尝试通过创建一个函数来编写一个简单的文本文件阅读器,该函数接收文件的路径并将每行文本转换为char数组,但它不起作用。
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();
}
这里出了什么问题?
从previous revision更改代码后,这似乎仍无效,现在它给了我一个XMLHttpRequest
例外101。
我已经在Firefox上测试了它并且它可以正常工作,但是在谷歌浏览器中它只是不起作用而且它一直给我一个例外101.我怎样才能让它不仅可以用于Firefox,还能用于其他浏览器(特别是Chrome)?
答案 0 :(得分:271)
您需要检查状态0(当使用XMLHttpRequest
在本地加载文件时,您没有返回状态,因为它不是来自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");
答案 1 :(得分:80)
访问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>
答案 2 :(得分:74)
在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
此技术在 Firefox 中运行良好,但似乎 Chrome 的
fetch
实施不支持file:///
网址方案在撰写此更新之日(在Chrome 68中测试)。
答案 3 :(得分:25)
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);
}
});
&#13;
<input type="file" id="myFile">
<hr>
<textarea style="width:500px;height: 400px" id="output"></textarea>
&#13;
答案 4 :(得分:14)
Jon Perryman,
是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/
答案 5 :(得分:13)
很明显你已经尝试过,输入“false”如下:
rawFile.open("GET", file, false);
答案 6 :(得分: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]);
}
答案 7 :(得分: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>
答案 8 :(得分:11)
按如下方式使用fileOrBlob.text()
:
<input type="file" onchange="this.files[0].text().then(t => console.log(t))">
当用户通过该输入上传文本文件时,它将被记录到控制台。 Here's a working jsbin demo。
这是更详细的版本:
<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中提供了新的Native File System API,以防您希望对用户选择的文件进行永久的读取(甚至写入)访问。
答案 9 :(得分:6)
这可能会有所帮助,
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();
答案 10 :(得分:3)
使用提取和异步功能
const logFileText = async file => {
const response = await fetch(file)
const text = await response.text()
console.log(text)
}
logFileText('file.txt')
答案 11 :(得分:1)
如果您查看控制台日志,则会找到“ Cross origin requests are not supported for protocol schemes: http, data, chrome, chrome-extension, https.
”
这表示Chrome浏览器会为每个域创建一种虚拟磁盘,该域通过上述列出的协议提供的文件都存储在该磁盘中,在本地磁盘上访问同一外部文件的文件受到相同来源策略的限制。 AJAX请求和响应发生在http / https上,因此不适用于本地文件。
Firefox没有设置此类限制,因此您的代码可以在Firefox上愉快地工作。但是,也有适用于chrome的解决方法:see here。
答案 12 :(得分: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>
答案 13 :(得分: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>
请注意:在Google Chrome上,如果HTML代码是本地代码,则会出现错误,但可以先保存HTML代码和文件,然后再运行在线HTML文件。
答案 14 :(得分:0)
为了使用chrome通过JavaScript
读取本地文件文本,chrome浏览器应使用参数--allow-file-access-from-files
运行以允许JavaScript访问本地文件,然后您可以使用{{1 }},如下所示:
XmlHttpRequest
答案 15 :(得分:0)
除了上述答案外,此修改后的解决方案对我也有效。
<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);
}
}
}
}
答案 16 :(得分:0)
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
我有以下文件结构:
答案 17 :(得分:0)
在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://中工作。
答案 18 :(得分:0)
如何读取本地文件?
通过此方法,您将通过loadText()加载文件,然后JS将异步等待,直到读取并加载该文件,之后它将执行readText()函数,使您可以继续使用常规的JS逻辑(也可以编写在出现任何错误的情况下在loadText()函数上尝试try catch块),但是对于本示例,我将其保持在最低水平。
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');
答案 19 :(得分:0)
如果要提示用户选择文件,请阅读其内容:
class HomeWidget extends StatefulWidget {
HomeWidget({ Key key }) : super(key: key);
@override
_HomeWidgetState createState() => _StatefulWidgetExampleState();
}
class _HomeWidgetState extends State<StatefulWidgetExample> {
List<int> _selectedTiles = [];
void toggleSelectedListTile(int index) {
if (_selectedTiles.contains(index))
setState(() => _selectedTiles.remove(index));
else
setState(() => _selectedTiles.add(index));
}
Widget _buildListTile(int index) {
return ListTile(
selected: _selectedTiles.contains(index),
selectedTileColor: Colors.red,
title: Text('List tile $index'),
onTap() { toggleSelectedListTile(index); },
);
}
@override
Widget build(BuildContext context)
return Scaffold(
body: new ListView.builder
(
itemCount: 3,
itemBuilder: (BuildContext ctxt, int index) => _buildListTile(index),
),
);
}
用法:
// 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();
}
答案 20 :(得分:-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)
});
我希望这会有所帮助。