Comment ouvrir un fichier disque local avec JavaScript?


155

J'ai essayé d'ouvrir le fichier avec

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

Le navigateur ne permet pas d'ouvrir un fichier local de cette façon, probablement pour des raisons de sécurité. Je souhaite utiliser les données du fichier côté client. Comment puis-je lire un fichier local en JavaScript?

Réponses:


238

Voici un exemple utilisant 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>


Spécifications

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

Compatibilité du navigateur

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

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


1
Juste une seconde, quand je recharge le même dernier fichier, le contenu ne change pas (je dis à propos de son contenu, lorsque j'édite le texte du fichier). Pouvez-vous m'aider?
Hydroper

1
@SamusHands Oui, vous avez raison, je peux reproduire le problème dans Safari et Chrome (cela fonctionne très bien dans Firefox). Définir la valeur de l'entrée nullsur chaque onClickévénement devrait faire l'affaire, voir: stackoverflow.com/a/12102992/63011
Paolo Moretti

3
C'est un bon exemple de FileReader, mais un commentaire sur ce qui displayContentsprécède: notez qu'un réglage innerHTMLcomme celui-ci avec un contenu non approuvé peut être une faille de sécurité. (Pour voir cela par vous-même, créez un bad.txtcontenant quelque chose comme <img src="/nonexistent" onerror="alert(1);">et voyez que l'alerte est exécutée - il pourrait s'agir d'un code plus malveillant.)
ShreevatsaR

2
@ShreevatsaR vraiment bon point. Mon extrait de code n'est qu'un exemple, mais vous avez raison, il ne devrait pas promouvoir de mauvaises habitudes de sécurité. J'ai remplacé innerHTMLpar textContent. Merci pour votre commentaire.
Paolo Moretti

1
@TeylerHalama Vous pouvez également utiliser l' DOMContentLoadedévénement pour cela.
Paolo Moretti

59

La fonction HTML5 fileReader vous permet de traiter les fichiers locaux, mais ceux-ci DOIVENT être sélectionnés par l'utilisateur, vous ne pouvez pas rechercher les fichiers sur le disque des utilisateurs.

J'utilise actuellement ceci avec les versions de développement de Chrome (6.x). Je ne sais pas quels autres navigateurs le prennent en charge.


3
Oui, c'est désormais possible avec HTML5. Regardez ici
Flavien Volken

1
Une analyse rapide de la spécification référencée (dernière mise à jour le 12/07/2012) ne montre aucune fonctionnalité pour l'écriture de fichier, uniquement la lecture.
RAP du

26

Parce que je n'ai pas de vie et que je veux ces 4 points de réputation afin de pouvoir montrer mon amour aux personnes qui sont vraiment douées pour le codage, j'ai partagé mon adaptation du code de Paolo Moretti . Utilisez simplement la openFile(fonction à exécuter avec le contenu du fichier comme premier paramètre) .

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>


2
Merci, a été utile. Cependant, notez qu'au lieu de ce code que vous avez clickElem(), vous pouvez simplement appeler fileInput.click(). (au moins dans la dernière version de Chrome)
Venryx

6

Essayer

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

mais l'utilisateur doit prendre des mesures pour choisir le fichier


Je viens de voir msg.innerText et pour la première fois, j'ai appris que certains éléments identifiés par des ID sont accessibles en utilisant des ID en tant que noms de variables ou propriétés de l'objet window.
fmalina le

donc la réponse est que nous ne pouvons pas . html semble si parfait pour l'interaction de documents! mais tout ne peut pas être servi. Un accès aux fichiers locaux aurait été bien
yota

@yota - le navigateur force l'utilisateur à interagir (et à être conscient) probablement pour des raisons de sécurité
Kamil Kiełczewski

-4

La méthode de requête xmlhttp n'est pas valide pour les fichiers sur le disque local car la sécurité du navigateur ne nous permet pas de le faire.Mais nous pouvons remplacer la sécurité du navigateur en créant un raccourci-> clic droit-> propriétés Dans le navigateur cible "... location path.exe "append --allow-file-access-from-files. Ceci est testé sur chrome, cependant il faut veiller à ce que toutes les fenêtres du navigateur soient fermées et que le code soit exécuté à partir du navigateur ouvert via ce raccourci.


-7

Vous ne pouvez pas. Les nouveaux navigateurs comme Firefox, Safari etc. bloquent le protocole «fichier». Cela ne fonctionnera que sur les anciens navigateurs.

Vous devrez télécharger les fichiers souhaités.


-9

Javascript ne peut généralement pas accéder aux fichiers locaux dans les nouveaux navigateurs, mais l'objet XMLHttpRequest peut être utilisé pour lire des fichiers. C'est donc Ajax (et non Javascript) qui lit le fichier.

Si vous souhaitez lire le fichier abc.txt, vous pouvez écrire le code comme suit :

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();

txtContient maintenant le contenu du fichier abc.txt.


61
Ajax est JavaScript.
The Muffin Man

4
@TheMuffinMan et XML. (Asynchronus Javascript et XML)
Quintec

9
Cette réponse n'est pas pertinente car l'op a demandé comment ouvrir les fichiers qui résident du côté client, pas les fichiers qui résident sur le serveur.
Thomas Nguyen

4
@ThomasNguyen, cette question est le premier résultat google de "javascript open file" et cette réponse est néanmoins bénéfique.
Nathan Goings

@ThomasNguyen Je suis d'accord, mais une solution de contournement possible sans FileReader pourrait être de télécharger le fichier sur le serveur et de le lire à partir de là. J'ai quand même rejeté cette réponse.
inf3rno
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.