Come aprire un file del disco locale con JavaScript?


155

Ho provato ad aprire il file con

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

Il browser non consente l'apertura di un file locale in questo modo, probabilmente per motivi di sicurezza. Voglio usare i dati del file sul lato client. Come posso leggere il file locale in JavaScript?

Risposte:


238

Ecco un esempio usando 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>


Specifiche

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

Compatibilità del browser

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

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


1
Solo un secondo, quando ricarico lo stesso ultimo file, il contenuto non cambia (dico del suo contenuto, quando modifico il testo del file). Puoi aiutare?
Idroper

1
@SamusHands Sì, hai ragione, posso riprodurre il problema in Safari e Chrome (funziona bene in Firefox). L'impostazione del valore dell'input nullsu ogni onClickevento dovrebbe fare il trucco, vedi: stackoverflow.com/a/12102992/63011
Paolo Moretti,

3
Questo è un buon esempio FileReader, ma un commento displayContentssopra: nota che l'impostazione innerHTMLcome questa con contenuto non attendibile può essere una vulnerabilità di sicurezza. (Per vederlo da solo, crea un bad.txtcontenitore contenente qualcosa di simile <img src="/nonexistent" onerror="alert(1);">e osserva che l'avviso viene eseguito: potrebbe trattarsi di un codice più dannoso.)
ShreevatsaR

2
@ShreevatsaR punto davvero buono. Il mio frammento è solo un esempio, ma hai ragione, non dovrebbe promuovere cattive abitudini di sicurezza. Ho sostituito innerHTMLcon textContent. Grazie per il tuo commento.
Paolo Moretti,

1
@TeylerHalama Puoi anche usare l' DOMContentLoadedevento per questo.
Paolo Moretti,

59

La funzione fileReader HTML5 consente di elaborare file locali, ma DEVONO essere selezionati dall'utente, non è possibile eseguire il rooting sul disco degli utenti alla ricerca di file.

Attualmente lo uso con le versioni di sviluppo di Chrome (6.x). Non so quali altri browser lo supportano.


3
Bene, ora è possibile con HTML5. Guarda qui
Flavien Volken,

1
Una rapida scansione delle specifiche di riferimento (ultimo aggiornamento 2012-07-12) non mostra alcuna possibilità per la scrittura di file, solo la lettura.
HBP,

26

Perché non ho una vita e voglio quei 4 punti reputazione in modo da poter mostrare il mio amore a (vota le risposte di) persone che sono effettivamente brave a scrivere codice e ho condiviso il mio adattamento del codice di Paolo Moretti . Basta usare la openFile(funzione da eseguire con il contenuto del file come primo parametro) .

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
Grazie, è stato utile Tuttavia nota che invece di quel codice che hai clickElem(), puoi invece semplicemente chiamare fileInput.click(). (almeno nell'ultima versione di Chrome)
Venryx il

6

Provare

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

ma l'utente deve agire per scegliere il file


Ho appena visto msg.innerText e per la prima volta ho appreso che è possibile accedere ad alcuni elementi identificati con ID utilizzando ID come nomi di variabili o proprietà dell'oggetto finestra.
Fmalina,

quindi la risposta è che non possiamo . HTML sembra così perfetto per l'interazione tra documenti! ma non tutto può essere servito. Un accesso ai file locali sarebbe stato bello
yota

@yota - il browser forza l'utente a interagire (ed essere consapevole) probabilmente per motivi di sicurezza
Kamil Kiełczewski

-4

Il metodo di richiesta xmlhttp non è valido per i file sul disco locale perché la sicurezza del browser non ci consente di farlo. Ma possiamo sovrascrivere la sicurezza del browser creando un collegamento-> tasto destro-> proprietà Nel target "... browser location path.exe "append --allow-file-access-from-files.Questo è testato su Chrome, tuttavia è necessario prestare attenzione a chiudere tutte le finestre del browser e eseguire il codice dal browser aperto tramite questo collegamento.


-7

Non puoi. I nuovi browser come Firefox, Safari ecc. Bloccano il protocollo "file". Funzionerà solo su vecchi browser.

Dovrai caricare i file che desideri.


-9

In genere Javascript non può accedere ai file locali nei nuovi browser, ma l'oggetto XMLHttpRequest può essere utilizzato per leggere i file. Quindi in realtà è Ajax (e non Javascript) a leggere il file.

Se vuoi leggere il file abc.txt, puoi scrivere il codice come:

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

Ora txtcontiene il contenuto del file abc.txt.


61
Ajax è JavaScript.
The Muffin Man,

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

9
Questa risposta non è rilevante in quanto l'operazione ha richiesto come aprire i file che risiedono sul lato client, non i file che risiedono sul server.
Thomas Nguyen,

4
@ThomasNguyen, questa domanda è il primo risultato google di "file javascript aperto" e questa risposta è comunque vantaggiosa.
Nathan Goings

@ThomasNguyen Sono d'accordo, ma una possibile soluzione alternativa senza FileReader potrebbe essere quella di caricare il file sul server e leggerlo da lì. Ho ancora votato in negativo questa risposta.
inf3rno,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.