Ich versuche, einen einfachen Textdatei-Reader zu schreiben, indem ich eine Funktion schreibe, die den Dateipfad übernimmt und jede Textzeile in ein Char-Array umwandelt, aber es funktioniert nicht.
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();
}
Was läuft hier falsch?
Dies scheint immer noch nicht zu funktionieren, nachdem der Code etwas von einer vorherigen Version geändert wurde. Jetzt wird mir eine XMLHttpRequest
-Ausnahme 101 angezeigt.
Ich habe dies auf Firefox getestet und es funktioniert, aber in Google Chrome funktioniert es einfach nicht und es gibt mir immer eine Ausnahme 101 )
Sie müssen nach Status 0 suchen (da beim lokalen Laden von Dateien mit XMLHttpRequest
kein Status zurückgegeben wird, da er nicht von einer Webserver
stammt
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);
}
Und geben Sie file://
in Ihrem Dateinamen an:
readTextFile("file:///C:/your/path/to/file.txt");
Besuchen Sie Javascripture ! Und geh den Abschnitt readAsText und versuche das Beispiel. Sie werden wissen können, wie das geht readAsText Die Funktion von FileReader funktioniert.
<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>
Nach der Einführung von fetch api in Javascript könnte das Lesen von Dateiinhalten nicht einfacher sein.
Lesen einer Textdatei
fetch('file.txt')
.then(response => response.text())
.then(text => console.log(text))
// outputs the content of the text file
Lesen einer Json-Datei
fetch('file.json')
.then(response => response.json())
.then(jsonResponse => console.log(jsonResponse))
// outputs a javascript object from the parsed json
Diese Technik funktioniert gut in Firefox, aber es scheint, als würde die _
fetch
-Implementierung von Chrome dasfile:///
-URL-Schema zum Zeitpunkt der Erstellung dieses Updates nicht unterstützen (getestet in Chrome 68).
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>
Jon Perryman,
Ja, js kann lokale Dateien lesen (siehe FileReader ()), jedoch nicht automatisch: Der Benutzer muss die Datei oder eine Liste von Dateien mit einem HTML-Code <input type=file>
an das Skript übergeben.
Mit js ist es dann möglich, die Datei oder die Liste der Dateien, einige ihrer Eigenschaften und den Inhalt der Datei oder Dateien zu bearbeiten (Beispielansicht).
Was js aus Sicherheitsgründen nicht tun kann, ist ein automatischer Zugriff (ohne Benutzereingabe) auf das Dateisystem seines Computers.
Damit js automatisch auf die lokalen fs zugreifen kann, ist es nicht erforderlich, eine HTML-Datei mit js darin zu erstellen, sondern ein hta-Dokument.
Eine hta-Datei kann js oder vbs enthalten.
Die ausführbare Datei hta funktioniert jedoch nur auf Windows-Systemen.
Dies ist ein Standardverhalten des Browsers.
Auch Google Chrome hat an der FSI API gearbeitet, weitere Infos hier: http://www.html5rocks.com/de/tutorials/file/filesystem/
Sie probieren es bereits, geben Sie "false" wie folgt ein:
rawFile.open("GET", file, false);
Versuchen Sie, zwei Funktionen zu erstellen:
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]);
}
anderes Beispiel - mein Reader mit der FileReader-Klasse
<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>
Das könnte helfen,
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();
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
- Dateitext von Javascript lesen
- Konsolentext aus Datei mit Javascript
- Google Chrome und Mozilla Firefox
In meinem Fall habe ich folgende Dateistruktur:
Abruf- und Asynchronfunktion verwenden
const logFileText = async file => {
const response = await fetch(file)
const text = await response.text()
console.log(text)
}
logFileText('file.txt')
<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>
Wenn Sie die Konsolenprotokolle überprüfen, werden Sie feststellen, dass Cross Origin-Anforderungen für Protokollschemas nicht unterstützt werden: http, data, chrome, chrome-extension, https.
Das bedeutet im Wesentlichen, dass Chrome für jede Domäne eine Art virtuelles Laufwerk erstellt. Alle Dateien, die von der Domäne über die oben aufgeführten Protokolle bereitgestellt werden, werden darin gespeichert. Aus Sicherheitsgründen ist der Zugriff auf Dateien außerhalb der lokalen Festplatte unter derselben Origin-Richtlinie eingeschränkt. AJAX -Anfragen und -Antworten erfolgen im Wesentlichen unter http/https, daher nicht für lokale Dateien.
Firefox nimmt diese Einschränkung nicht vor, daher funktioniert Ihr Code problemlos mit Firefox. Es gibt jedoch auch Problemumgehungen für Chrom: siehe hier .
Neben einigen der obigen Antworten funktionierte diese modifizierte Lösung für mich.
<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);
}
}
}
}
Sie können meine Bibliothek importieren:
<script src="https://www.editeyusercontent.com/preview/1c_hhRGD3bhwOtWwfBD8QofW9rD3T1kbe/[email protected]"></script>
dann gibt die Funktion fetchfile(path)
die hochgeladene Datei .__ zurück.
<script src="https://www.editeyusercontent.com/preview/1c_hhRGD3bhwOtWwfBD8QofW9rD3T1kbe/code.js"></script>
<script>console.log(fetchfile("file.txt"))</script>
Bitte beachten Sie: Wenn der HTML-Code in Google Chrome lokal ist, werden Fehler angezeigt. Wenn Sie den HTML-Code und die Dateien jedoch online speichern, wird die Online-HTML-Datei ausgeführt.
Lokale Dateidaten beim Laden von js (data.js) abrufen:
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);
}
datei von data.js wie:
var mSdata = hereDoc(function() {/*!
17,399
1237,399
BLAHBLAH
BLAHBLAH
155,82
194,376
*/});
dynamic UnixTime QueryString verhindert zwischengespeicherte.
AJ arbeitet im Web http: //.
Um einen lokalen Datei-Text durch JavaScript
mit Chrome zu lesen, sollte der Chrome-Browser mit dem Argument --allow-file-access-from-files
ausgeführt werden, damit JavaScript auf die lokale Datei zugreifen kann. Anschließend können Sie es mit XmlHttpRequest
wie folgt lesen:
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4) {
var allText = xmlhttp.responseText;
}
};
xmlhttp.open("GET", file, false);
xmlhttp.send(null);