Bagaimana cara membuka file disk lokal dengan JavaScript?

155

Saya mencoba membuka file dengan

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

Peramban tidak mengizinkan membuka file lokal dengan cara ini, mungkin karena alasan keamanan. Saya ingin menggunakan data file di sisi klien. Bagaimana saya bisa membaca file lokal dalam JavaScript?

Joval
sumber

Jawaban:

238

Berikut ini contoh menggunakan 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>


Spesifikasi

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

Kompatibilitas browser

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

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

Paolo Moretti
sumber
1
Hanya satu detik, ketika saya memuat ulang file terakhir yang sama, konten tidak berubah (saya katakan tentang kontennya, ketika saya mengedit teks file). Bisakah kamu menolong?
Hydroper
1
@SamusHands Ya, Anda benar, saya dapat mereproduksi masalah di Safari dan Chrome (berfungsi dengan baik di Firefox). Menyetel nilai input nullpada setiap onClickacara harus melakukan trik, lihat: stackoverflow.com/a/12102992/63011
Paolo Moretti
3
Ini bagus sebagai contoh FileReader, tetapi komentar di displayContentsatas: perhatikan bahwa pengaturan innerHTMLseperti ini dengan konten yang tidak dipercaya bisa menjadi kerentanan keamanan. (Untuk melihat ini sendiri, buat bad.txtsesuatu yang berisi seperti <img src="/nonexistent" onerror="alert(1);">dan lihat bahwa peringatan itu dieksekusi — itu bisa jadi kode yang lebih berbahaya.)
ShreevatsaR
2
@ShreevatsaR poin yang sangat bagus. Cuplikan saya hanyalah sebuah contoh, tetapi Anda benar, itu seharusnya tidak mempromosikan kebiasaan keamanan yang buruk. Saya diganti innerHTMLdengan textContent. Terima kasih atas komentar Anda.
Paolo Moretti
1
@TeylerHalama Anda juga dapat menggunakan DOMContentLoadedacara untuk itu.
Paolo Moretti
59

Fasilitas fileReader HTML5 memang memungkinkan Anda untuk memproses file lokal, tetapi ini HARUS dipilih oleh pengguna, Anda tidak dapat me-rooting tentang disk pengguna mencari file.

Saat ini saya menggunakan ini dengan versi pengembangan Chrome (6.x). Saya tidak tahu apa yang didukung browser lain.

HBP
sumber
3
Benar, sekarang mungkin dengan HTML5. Lihat di sini
Flavien Volken
1
Pemindaian cepat dari spec yang direferensikan (terakhir diperbarui 2012-07-12) tidak menunjukkan fasilitas untuk menulis file, hanya membaca.
HBP
26

Karena saya tidak memiliki kehidupan dan saya ingin 4 poin reputasi tersebut sehingga saya dapat menunjukkan cintaku kepada (meningkatkan jawaban oleh) orang-orang yang benar-benar pandai dalam pengkodean, saya telah membagikan adaptasi saya terhadap kode Paolo Moretti . Cukup gunakan openFile(fungsi yang akan dieksekusi dengan konten file sebagai parameter pertama) .

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
sumber
2
Terima kasih, sangat membantu. Meskipun perhatikan bahwa alih-alih kode yang Anda miliki clickElem(), Anda dapat menelepon saja fileInput.click(). (setidaknya dalam versi terbaru Chrome)
Venryx
6

Mencoba

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

tetapi pengguna perlu mengambil tindakan untuk memilih file

Kamil Kiełczewski
sumber
Saya baru saja melihat msg.innerText dan untuk pertama kalinya saya mengetahui bahwa beberapa elemen yang diidentifikasi dengan ID dapat diakses menggunakan ID sebagai nama variabel atau properti dari objek window.
fmalina
jadi jawabannya adalah kita tidak bisa . html tampaknya sangat sempurna untuk interaksi dokumen! tapi tidak semuanya bisa dilayani. Akses file lokal akan menyenangkan
yota
@yota - browser memaksa pengguna untuk berinteraksi (dan waspada) mungkin karena alasan keamanan
Kamil Kiełczewski
-4

Metode permintaan xmlhttp tidak valid untuk file di disk lokal karena keamanan browser tidak memungkinkan kami melakukannya. Tapi kami dapat mengganti keamanan browser dengan membuat pintasan-> klik kanan-> properti Pada target "... browser location path.exe "append --allow-file-access-from-files. Ini diuji pada chrome, namun harus diperhatikan bahwa semua jendela browser harus ditutup dan kode harus dijalankan dari browser yang dibuka melalui pintasan ini.

pengguna2450701
sumber
-7

Kamu tidak bisa Browser baru seperti Firefox, Safari dll. Memblokir protokol 'file'. Ini hanya akan berfungsi pada browser lama.

Anda harus mengunggah file yang Anda inginkan.

Youssef
sumber
-9

Javascript biasanya tidak dapat mengakses file lokal di browser baru tetapi objek XMLHttpRequest dapat digunakan untuk membaca file. Jadi sebenarnya Ajax (dan bukan Javascript) yang sedang membaca file.

Jika Anda ingin membaca file abc.txt, Anda dapat menulis kode sebagai:

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

Sekarang txtberisi konten file abc.txt.

Karanpreet Singh
sumber
61
Ajax adalah JavaScript.
The Muffin Man
4
@TheMuffinMan dan XML. (Asynchronus Javascript dan XML)
Quintec
9
Jawaban ini tidak relevan karena op meminta cara membuka file yang berada di sisi klien, bukan file yang berada di server.
Thomas Nguyen
4
@ThomasNguyen, pertanyaan ini adalah hasil google pertama dari "file open javascript" dan jawaban ini tetap bermanfaat.
Nathan Goings
@ThomasNguyen Saya setuju, tapi solusi yang mungkin dilakukan tanpa FileReader adalah mengunggah file ke server dan membacanya dari sana. Namun saya tetap memilih jawaban ini.
inf3rno