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(); } |
这是怎么了?
从先前的版本中稍稍更改了代码后,这似乎仍然不起作用,现在给了我一个
我已经在Firefox上对其进行了测试,并且可以工作,但是在Google Chrome中它却无法工作,并且一直给我一个异常101。如何使它不仅可以在Firefox上而且还可以在其他浏览器(尤其是Chrome)上运行 )?
您需要检查状态0(如使用
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); } |
并在文件名中指定
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 supportfile:/// 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调用。
如果您查看控制台日志,则会发现"
这表示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具有以下文件结构:
console.log结果:
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通过
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]"> |
然后,函数
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://中工作。