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以降
  • Chrome 13以降
  • Safari 6.1以降

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


1
たった1秒で、同じ最後のファイルを再ロードしても、内容は変わりません(ファイルのテキストを編集するときに、その内容について言います)。手伝ってくれますか?
Hydroper、2015年

1
@SamusHandsええ、そうです、SafariとChromeで問題を再現できます(Firefoxでは問題なく動作します)。nullonClickイベントで入力の値をに設定するとうまくいくはずです。stackoverflow.com
Paolo Moretti

3
これはの例としては適切ですがFileReaderdisplayContents上記に対するコメントinnerHTMLです。信頼できないコンテンツでこのように設定すると、セキュリティ上の脆弱性になる可能性があることに注意してください。(これを自分で確認するには、bad.txt次のようなコンテナを作成<img src="/nonexistent" onerror="alert(1);">し、アラートが実行されることを確認します。より悪質なコードである可能性があります。)
ShreevatsaR

2
@ShreevatsaR本当に良い点。私のスニペットはほんの一例ですが、そうです、セキュリティの悪い習慣を助長してはなりません。に置き換えinnerHTMLましたtextContent。コメントありがとうございます。
パオロモレッティ2017年

1
@TeylerHalama DOMContentLoadedそのためのイベントも使用できます。
Paolo Moretti

59

HTML5 FileReaderの機能は、ローカルファイルを処理することができませんが、これらは、ユーザが選択しなければならない、あなたはファイルを探しているユーザーのディスクについては応援に行くことができません。

現在、Chromeの開発バージョン(6.x)で使用しています。他のブラウザでサポートされているものはわかりません。


3
そう、HTML5で可能になりました。ここを見てください
フラヴィアンフォルケン

1
参照されている仕様(最後に更新された2012-07-12)のクイックスキャンでは、ファイルの書き込み機能はなく、読み取りのみが示されています。
HBP 2012

26

私には人生がなく、これらの4つの評判ポイントが欲しいので、私は実際にコーディングが得意な人に(賛成投票で)愛を示すことができます。パオロモレッティのコードの私の適応を共有しました。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 2018

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-おそらくセキュリティ上の理由により、ブラウザはユーザーに対話(および注意)を強制します
KamilKiełczewski

-4

ブラウザのセキュリティで許可されていないため、xmlhttpリクエストメソッドはローカルディスク上のファイルに対して無効です。ただし、ショートカット->右クリック->プロパティを作成することで、ブラウザのセキュリティを上書きできます。 location path.exe "append --allow-file-access-from-files。これはChromeでテストされていますが、すべてのブラウザーウィンドウを閉じ、このショートカットで開いたブラウザーからコードを実行する必要があります。


-7

できません。Firefox、Safariなどの新しいブラウザは「ファイル」プロトコルをブロックします。古いブラウザでのみ動作します。

必要なファイルをアップロードする必要があります。


-9

JavaScriptは通常、新しいブラウザのローカルファイルにアクセスできませんが、XMLHttpRequestオブジェクトを使用してファイルを読み取ることができます。したがって、実際にファイルを読み取っているのは、JavaScriptではなくAjaxです。

ファイルを読みたい場合は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();

これtxtで、abc.txtファイルの内容が含まれます。


61
AjaxはJavaScriptです。
マフィンマン

4
@TheMuffinManおよびXML。(非同期JavascriptおよびXML)
Quintec

9
サーバーに常駐するファイルではなく、クライアント側に常駐するファイルを開く方法をopが要求したため、この回答は関係ありません。
Thomas Nguyen

4
@ThomasNguyen、この質問は「javascript open file」の最初のgoogle結果であり、それでもなおこの回答は有益です。
Nathan Goings、2015年

@ThomasNguyen同意しますが、FileReaderなしで可能な回避策は、ファイルをサーバーにアップロードしてそこから読み取ることです。それでも私はこの回答に反対票を投じました。
inf3rno 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.