JavaScript로 로컬 디스크 파일을 여는 방법은 무엇입니까?


155

나는 파일을 열려고 시도했다.

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

브라우저는 아마도 보안상의 이유로 로컬 파일을 이런 방식으로 열 수 없습니다. 클라이언트 측에서 파일 데이터를 사용하고 싶습니다. JavaScript로 로컬 파일을 읽으려면 어떻게해야합니까?

답변:


238

다음은 다음을 사용하는 예입니다 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>


명세서

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

브라우저 호환성

  • IE 10 이상
  • Firefox 3.6 이상
  • 크롬 13+
  • 사파리 6.1 이상

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


1
동일한 마지막 파일을 다시로드 할 때 불과 1 초 만에 내용이 변경되지 않습니다 (파일 텍스트를 편집 할 때 내용에 대해 말합니다). 도울 수 있니?
Hydroper

1
@SamusHands 네, 맞습니다. Safari와 Chrome에서 문제를 재현 할 수 있습니다 (Firefox에서 잘 작동합니다). nullonClick이벤트 에서 입력 값을 설정하면 트릭을 수행해야합니다. stackoverflow.com/a/12102992/63011
Paolo Moretti

3
이 예는 좋지만 위 FileReader의 설명은 신뢰할 수 없습니다. 신뢰할 수없는 콘텐츠를 사용하여 이와 같이 displayContents설정 innerHTML하면 보안 취약점이 될 수 있습니다. (자신을 위해이를 확인하려면 bad.txt다음과 같은 <img src="/nonexistent" onerror="alert(1);">내용을 포함하고 경고가 실행
되는지 확인하십시오

2
@ShreevatsaR 정말 좋은 지적입니다. 내 스 니펫은 단지 예일뿐입니다. 그러나 올바른 보안 습관을 조장해서는 안됩니다. 로 교체 innerHTML했습니다 textContent. 귀하의 의견에 감사드립니다.
Paolo Moretti 2016 년

1
@TeylerHalama 또한 해당 DOMContentLoaded이벤트를 사용할 수 있습니다 .
Paolo Moretti

59

HTML5을 FileReader 시설은 로컬 파일을 처리 할 수 있도록 않지만, 다음은, 당신은 파일을 찾는 사용자의 디스크에 대한 응원을 갈 수 없어 사용자가 선택해야합니다.

현재 Chrome (6.x) 개발 버전에서이 기능을 사용하고 있습니다. 다른 브라우저에서 어떤 브라우저를 지원하는지 모르겠습니다.


3
그렇습니다. 이제 HTML5로 가능합니다. 여기를 봐
Flavien Volken

1
참조 된 사양 (빠른 업데이트 2012-07-12)의 빠른 스캔은 파일 쓰기 기능이없고 읽기 전용 기능 만 보여줍니다.
HBP

26

나는 삶이없고 그 4 가지 평판 포인트를 원하기 때문에 실제로 코딩에 능숙한 사람들에게 내 사랑을 보여줄 수 있기 때문에 나는 Paolo Moretti 의 코드에 대한 나의 적응을 공유했습니다 . openFile(첫 번째 매개 변수로 파일 내용으로 실행되는 기능을 사용 하십시오) .

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
감사합니다. 당신이 가지고있는 그 코드 대신에 clickElem(), 당신은 대신에 전화 할 수 있다는 것을 주목하라 fileInput.click(). (최소한 최신 버전의 Chrome에서)
Venryx

6

시험

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

하지만 사용자는 파일을 선택하기 위해 조치를 취해야합니다


방금 msg.innerText를 보았고 처음으로 ID로 식별 된 일부 요소에 ID를 사용하여 창 객체의 변수 이름 또는 속성으로 액세스 할 수 있음을 알게되었습니다.
fmalina

대답은 우리할 수 없다는 것 입니다. html은 문서 상호 작용에 매우 적합합니다! 그러나 모든 것이 제공 될 수있는 것은 아닙니다. 로컬 파일 액세스는 좋았을 것입니다.
yota

@yota-브라우저로 인해 보안상의 이유로 사용자가 상호 작용하고 인식해야 함
Kamil Kiełczewski

-4

브라우저 보안은 그렇게 할 수 없기 때문에 xmlhttp 요청 메소드는 로컬 디스크의 파일에 유효하지 않습니다. location path.exe "append --allow-file-access-from-files. 크롬에서 테스트되지만 모든 브라우저 창을 닫고이 바로 가기를 통해 열린 브라우저에서 코드를 실행해야합니다.


-7

당신은 할 수 없습니다. Firefox, Safari 등과 같은 새로운 브라우저는 '파일'프로토콜을 차단합니다. 오래된 브라우저에서만 작동합니다.

원하는 파일을 업로드해야합니다.


-9

Javascript는 일반적으로 새 브라우저에서 로컬 파일에 액세스 할 수 없지만 XMLHttpRequest 객체를 사용하여 파일을 읽을 수 있습니다. 따라서 실제로 파일을 읽는 것은 Ajax (Javascript 아님)입니다.

파일을 읽으려면 다음 abc.txt과 같이 코드를 작성할 수 있습니다.

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

이제 txtabc.txt 파일의 내용이 들어 있습니다.


61
Ajax는 JavaScript입니다.
머핀 남자

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

9
이 답변은 서버에있는 파일이 아니라 클라이언트쪽에있는 파일을 여는 방법을 요청한 op와 관련이 없습니다.
Thomas Nguyen

4
@ThomasNguyen,이 질문은 "javascript open file"의 첫 번째 Google 결과이며 그럼에도 불구 하고이 답변은 유익합니다.
Nathan Goings 2016 년

@ThomasNguyen 동의하지만 FileReader가 없으면 가능한 해결책은 파일을 서버에 업로드하여 서버에서 읽을 수 있습니다. 여전히 나는이 대답을 downvoted.
inf3rno
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.