Wie öffne ich eine lokale Festplattendatei mit JavaScript?

154

Ich habe versucht, die Datei mit zu öffnen

window.open("file:///D:/Hello.txt");

Der Browser erlaubt das Öffnen einer lokalen Datei auf diese Weise möglicherweise aus Sicherheitsgründen nicht. Ich möchte die Daten der Datei auf der Clientseite verwenden. Wie kann ich lokale Dateien in JavaScript lesen?

Joval
quelle

Antworten:

238

Hier ist ein Beispiel mit FileReader:

function readSingleFile(e) {
  var file = e.target.files[0];
  if (!file) {
    return;
  }
  var reader = new FileReader();
  reader.onload = function(e) {
    var contents = e.target.result;
    displayContents(contents);
  };
  reader.readAsText(file);
}

function displayContents(contents) {
  var element = document.getElementById('file-content');
  element.textContent = contents;
}

document.getElementById('file-input')
  .addEventListener('change', readSingleFile, false);
<input type="file" id="file-input" />
<h3>Contents of the file:</h3>
<pre id="file-content"></pre>


Technische Daten

http://dev.w3.org/2006/webapi/FileAPI/

Browser-Kompatibilität

  • IE 10+
  • Firefox 3.6+
  • Chrome 13+
  • Safari 6.1+

http://caniuse.com/#feat=fileapi

Paolo Moretti
quelle
1
Nur eine Sekunde, wenn ich dieselbe letzte Datei neu lade, ändert sich der Inhalt nicht (ich sage über den Inhalt, wenn ich den Dateitext bearbeite). Kannst du helfen?
Hydroper
1
@SamusHands Ja, Sie haben Recht, ich kann das Problem in Safari und Chrome reproduzieren (es funktioniert gut in Firefox). Das Setzen des Wertes der Eingabe auf nullfür jedes onClickEreignis sollte den Trick tun, siehe: stackoverflow.com/a/12102992/63011
Paolo Moretti
3
Dies ist ein gutes Beispiel dafür FileReader, aber ein Kommentar zu dem displayContentsoben innerHTMLGesagten : Beachten Sie, dass eine solche Einstellung mit nicht vertrauenswürdigen Inhalten eine Sicherheitslücke darstellen kann. (Um dies selbst zu sehen, erstellen Sie ein bad.txt<img src="/nonexistent" onerror="alert(1);">
Element
2
@ShreevatsaR wirklich guter Punkt. Mein Snippet ist nur ein Beispiel, aber Sie haben Recht, es sollte keine schlechten Sicherheitsgewohnheiten fördern. Ich ersetzte innerHTMLdurch textContent. Vielen Dank für Ihren Kommentar.
Paolo Moretti
1
@TeylerHalama Sie können das DOMContentLoadedEreignis auch dafür verwenden.
Paolo Moretti
59

Mit der HTML5-Funktion "fileReader" können Sie zwar lokale Dateien verarbeiten. Diese MÜSSEN jedoch vom Benutzer ausgewählt werden. Sie können nicht auf der Festplatte des Benutzers nach Dateien suchen.

Ich verwende dies derzeit mit Entwicklungsversionen von Chrome (6.x). Ich weiß nicht, welche anderen Browser dies unterstützen.

HBP
quelle
3
Richtig, jetzt ist es mit HTML5 möglich. Schauen Sie hier
Flavien Volken
1
Ein schneller Scan der referenzierten Spezifikation (letzte Aktualisierung 2012-07-12) zeigt keine Möglichkeiten zum Schreiben von Dateien, sondern nur zum Lesen.
HBP
26

Da ich kein Leben habe und diese 4 Reputationspunkte möchte, damit ich meine Liebe gegenüber (positiven Antworten von) Menschen zeigen kann, die tatsächlich gut im Codieren sind, habe ich meine Anpassung von Paolo Morettis Code geteilt. Verwenden Sie einfach die openFile(Funktion, die mit dem Dateiinhalt als erstem Parameter ausgeführt werden soll) .

function dispFile(contents) {
  document.getElementById('contents').innerHTML=contents
}
function clickElem(elem) {
	// Thx user1601638 on Stack Overflow (6/6/2018 - /programming/13405129/javascript-create-and-save-file )
	var eventMouse = document.createEvent("MouseEvents")
	eventMouse.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
	elem.dispatchEvent(eventMouse)
}
function openFile(func) {
	readFile = function(e) {
		var file = e.target.files[0];
		if (!file) {
			return;
		}
		var reader = new FileReader();
		reader.onload = function(e) {
			var contents = e.target.result;
			fileInput.func(contents)
			document.body.removeChild(fileInput)
		}
		reader.readAsText(file)
	}
	fileInput = document.createElement("input")
	fileInput.type='file'
	fileInput.style.display='none'
	fileInput.onchange=readFile
	fileInput.func=func
	document.body.appendChild(fileInput)
	clickElem(fileInput)
}
Click the button then choose a file to see its contents displayed below.
<button onclick="openFile(dispFile)">Open a file</button>
<pre id="contents"></pre>

SignatureSmileyfaceProductions
quelle
2
Danke, war hilfreich. Beachten Sie jedoch, dass Sie anstelle des Codes, den Sie eingegeben haben clickElem(), einfach anrufen können fileInput.click(). (zumindest in der neuesten Version von Chrome)
Venryx
6

Versuchen

function readFile(file) {
  return new Promise((resolve, reject) => {
    let fr = new FileReader();
    fr.onload = x=> resolve(fr.result);
    fr.readAsText(file);
})}

Der Benutzer muss jedoch Maßnahmen ergreifen, um die Datei auszuwählen

Kamil Kiełczewski
quelle
Ich habe gerade msg.innerText gesehen und zum ersten Mal erfahren, dass auf einige mit IDs identifizierte Elemente über IDs als Variablennamen oder Eigenschaften des Fensterobjekts zugegriffen werden kann.
Fmalina
Die Antwort ist also, wir können nicht . HTML scheint so perfekt für die Interaktion mit Dokumenten! aber nicht alles kann serviert werden. Ein lokaler Dateizugriff wäre schön gewesen
yota
@yota - Browser zwingt Benutzer wahrscheinlich aus Sicherheitsgründen zur Interaktion (und ist sich dessen bewusst)
Kamil Kiełczewski
-4

Die xmlhttp-Anforderungsmethode ist für die Dateien auf der lokalen Festplatte nicht gültig, da die Browsersicherheit dies nicht zulässt. Sie können die Browsersicherheit jedoch überschreiben, indem Sie eine Verknüpfung-> Rechtsklick-> Eigenschaften im Zielbrowser "..." erstellen location path.exe "append --allow-file-access-from-files.Dies wird auf Chrome getestet. Es sollte jedoch darauf geachtet werden, dass alle Browserfenster geschlossen und der Code über den über diese Verknüpfung geöffneten Browser ausgeführt wird.

user2450701
quelle
-7

Das kannst du nicht. Neue Browser wie Firefox, Safari usw. blockieren das Dateiprotokoll. Es funktioniert nur mit alten Browsern.

Sie müssen die gewünschten Dateien hochladen.

Youssef
quelle
-9

Javascript kann in neuen Browsern normalerweise nicht auf lokale Dateien zugreifen, aber das XMLHttpRequest-Objekt kann zum Lesen von Dateien verwendet werden. Es ist also tatsächlich Ajax (und nicht Javascript), das die Datei liest.

Wenn Sie die Datei lesen möchten abc.txt, können Sie den Code wie folgt schreiben:

var txt = '';
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function(){
  if(xmlhttp.status == 200 && xmlhttp.readyState == 4){
    txt = xmlhttp.responseText;
  }
};
xmlhttp.open("GET","abc.txt",true);
xmlhttp.send();

txtEnthält jetzt den Inhalt der Datei abc.txt.

Karanpreet Singh
quelle
61
Ajax ist JavaScript.
Der Muffin-Mann
4
@ TheMuffinMan und XML. (Asynchronus Javascript und XML)
Quintec
9
Diese Antwort ist nicht relevant, da die Operation gefragt hat, wie Dateien auf der Clientseite geöffnet werden sollen, nicht Dateien auf dem Server.
Thomas Nguyen
4
@ThomasNguyen, diese Frage ist das erste Google-Ergebnis von "Javascript Open File" und diese Antwort ist dennoch von Vorteil.
Nathan Goings
@ThomasNguyen Ich stimme zu, aber eine mögliche Problemumgehung ohne FileReader könnte darin bestehen, die Datei auf den Server hochzuladen und von dort aus zu lesen. Trotzdem habe ich diese Antwort abgelehnt.
inf3rno