Yerel disk dosyası JavaScript ile nasıl açılır?


155

İle dosyayı açmaya çalıştım

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

Tarayıcı, muhtemelen güvenlik nedeniyle yerel bir dosyanın bu şekilde açılmasına izin vermez. İstemci tarafında dosyanın verilerini kullanmak istiyorum. Yerel dosyayı JavaScript'te nasıl okuyabilirim?

Yanıtlar:


238

İşte bir örnek 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>


gözlük

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

Tarayıcı Uyumluluğu

  • IE 10+
  • Firefox 3.6 ve üzeri
  • Chrome 13+
  • Safari 6.1 ve üzeri

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


1
Sadece bir saniye, aynı son dosyayı yeniden yüklediğimde içerik değişmiyor (dosya metnini düzenlediğimde içeriği hakkında söylüyorum). Yardım edebilir misin?
Hydroper

1
@SamusHands Evet, haklısın, Safari ve Chrome'da sorunu yeniden oluşturabilirim (Firefox'ta iyi çalışıyor). nullHer onClickolayın giriş değerinin ayarlanması hile yapmalıdır, bkz .: stackoverflow.com/a/12102992/63011
Paolo Moretti

3
Bu bir örnek olarak iyidir FileReader, ancak displayContentsyukarıdaki bir yorumdur : innerHTMLgüvenilmeyen içerikle böyle bir ayarın bir güvenlik açığı olabileceğini unutmayın . (Bunu kendiniz görmek için bad.txtbenzer bir şey oluşturun <img src="/nonexistent" onerror="alert(1);">ve uyarının yürütüldüğünü görün - daha kötü niyetli bir kod olabilir.)
ShreevatsaR

2
@ShreevatsaR gerçekten iyi bir nokta. Snippet'im sadece bir örnek, ama haklısın, kötü güvenlik alışkanlıklarını desteklememeli. Ben yerini innerHTMLile textContent. Yorumun için teşekkürler.
Paolo Moretti

1
@TeylerHalama DOMContentLoadedEtkinliği bunun için de kullanabilirsiniz .
Paolo Moretti

59

HTML5 FileReader tesis yerel dosyaları işlemek için izin vermez, ancak bu, dosyaların arayan kullanıcıların diske hakkında köklenmeyi gidemez kullanıcı tarafından seçilmek zorundadır.

Şu anda bunu Chrome'un (6.x) geliştirme sürümleriyle kullanıyorum. Diğer tarayıcıların neyi desteklediğini bilmiyorum.


3
Doğru, artık HTML5 ile mümkün. Buraya bak
Flavien Volken

1
Referans verilen spesifikasyonun hızlı bir şekilde taranması (son güncelleme: 2012-07-12), dosya yazma için hiçbir olanak göstermez, sadece okuma için.
HBP

26

Hayatım olmadığı ve bu 4 itibar puanını istediğim için kodlamada gerçekten iyi olan insanlara (cevapları oylayarak) sevgimi gösterebilirim Paolo Moretti'nin koduna adaptasyonumu paylaştım . Sadece openFile(ilk parametre olarak dosya içeriğiyle yürütülecek işlevi kullanın) .

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
Teşekkürler, yardımcı oldu. İçinde bulunduğunuz kod clickElem()yerine, sadece arayabileceğinizi unutmayın fileInput.click(). (en azından Chrome'un en son sürümünde)
Venryx

6

Deneyin

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

ancak kullanıcının dosyayı seçmek için işlem yapması gerekir


Ben sadece msg.innerText gördüm ve ilk kez kimlikleri ile tanımlanan bazı öğelere değişkenler veya pencere nesnesinin özellikleri olarak kimlikleri kullanarak erişilebilir olduğunu öğrendim.
fmalina

yani cevap veremeyiz . html belge etkileşimi için mükemmel görünüyor! ama her şey servis edilemez. Yerel bir dosya erişimi iyi olurdu
yota

@yota - tarayıcıyı muhtemelen güvenlik nedeniyle etkileşime girmeye (ve farkında olmaya)
zorlar

-4

Xmlhttp istek yöntemi yerel diskteki dosyalar için geçerli değil çünkü tarayıcı güvenliği bunu yapmamıza izin vermiyor.Ancak tarayıcı kısayol-> sağ tıklama-> Hedefte özellikler "... location path.exe "append --allow-file-access-from-files.Bu, krom üzerinde test edilmiştir, ancak tüm tarayıcı pencerelerinin kapatılması ve kodun bu kısayol ile açılan tarayıcıdan çalıştırılması gerektiğine dikkat edilmelidir.


-7

Yapamazsın. Firefox, Safari vb. Gibi yeni tarayıcılar 'dosya' protokolünü engeller. Yalnızca eski tarayıcılarda çalışır.

İstediğiniz dosyaları yüklemeniz gerekir.


-9

Javascript genellikle yeni tarayıcılardaki yerel dosyalara erişemez, ancak XMLHttpRequest nesnesi dosyaları okumak için kullanılabilir. Yani aslında dosyayı okuyan Ajax (Javascript değil).

Dosyayı okumak abc.txtistiyorsanız, kodu şu şekilde yazabilirsiniz:

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

Şimdi txtabc.txt dosyasının içeriğini içermektedir.


61
Ajax JavaScript'dir.
Muffin Adam

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

9
Bu yanıt, sunucuda bulunan dosyaların değil, istemci tarafında bulunan dosyaların nasıl açılacağını sorduğu gibi ilgili değildir.
Thomas Nguyen

4
@ThomasNguyen, bu soru "javascript açık dosyası" nın ilk google sonucudur ve yine de bu cevap faydalıdır.
Nathan Goings

@ Kabul ediyorum, ancak FileReader olmadan olası bir çözüm dosyayı sunucuya yüklemek ve oradan okumak olabilir. Yine de bu cevabı reddettim.
inf3rno
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.