如何使用 JavaScript 打开本地磁盘文件?

IT技术 javascript
2021-02-08 08:30:05

我试图打开文件

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

浏览器不允许以这种方式打开本地文件,可能是出于安全原因。我想在客户端使用文件的数据。如何在 JavaScript 中读取本地文件?

6个回答

这是一个使用示例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/

浏览器兼容性

  • 浏览器 10+
  • 火狐 3.6+
  • 铬 13+
  • Safari 6.1+

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

@SamusHands 是的,你说得对,我可以在 Safari 和 Chrome 中重现这个问题(它在 Firefox 中工作正常)。将输入的值设置为null每个onClick事件应该可以解决问题,请参阅:stackoverflow.com/a/12102992/63011
2021-03-11 08:30:05
只需一秒钟,当我重新加载同一个文件时,内容不会改变(当我编辑文件文本时,我说的是它的内容)。你能帮我吗?
2021-03-23 08:30:05
@TeylerHalama 您也可以为此使用该DOMContentLoaded事件。
2021-03-27 08:30:05
这是一个很好的例子FileReader,但对displayContents上面的评论:请注意,innerHTML使用不受信任的内容进行这样的设置可能是一个安全漏洞。(要亲眼看到这一点,请创建一个bad.txt包含类似内容的内容<img src="/nonexistent" onerror="alert(1);">并查看警报是否被执行——它可能是更恶意的代码。)
2021-04-02 08:30:05
@ShreevatsaR 真的很好。我的代码片段只是一个例子,但你是对的,它不应该促进不良的安全习惯。我替换innerHTMLtextContent. 谢谢你的评论。
2021-04-04 08:30:05

HTML5的FileReader设施确实允许您处理本地文件,但这些必须由用户来选择,你不能去生根关于用户硬盘寻找文件。

我目前在 Chrome (6.x) 的开发版本中使用它。我不知道其他浏览器支持它。

是的,现在可以使用 HTML5。看这里
2021-03-15 08:30:05
快速浏览参考规范(上次更新于 2012 年 7 月 12 日)显示没有用于文件写入的工具,只有读取。
2021-03-21 08:30:05
@Flavien Volken 不,这是不可能的。本地文件必须由用户选择
2021-03-26 08:30:05

因为我没有生命,我想要这 4 个声望点,所以我可以向真正擅长编码的人表达我的爱(支持答案)我分享了我对Paolo Moretti代码的改编只需使用openFile(将文件内容作为第一个参数执行的函数)

function dispFile(contents) {
  document.getElementById('contents').innerHTML=contents
}
function clickElem(elem) {
	// Thx user1601638 on Stack Overflow (6/6/2018 - https://stackoverflow.com/questions/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>

谢谢,很有帮助。尽管请注意clickElem(),您可以使用fileInput.click(). (至少在最新版本的 Chrome 中)
2021-03-14 08:30:05
对我有用,它所基于的代码不适用。
2021-04-08 08:30:05

尝试

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 作为窗口对象的变量名或属性来访问。
2021-03-22 08:30:05
所以答案是我们不能html 似乎非常适合文档交互!但并非所有东西都可以送达。本地文件访问会很好
2021-03-25 08:30:05
@yota - 浏览器强制用户交互(并注意)可能是出于安全原因
2021-04-03 08:30:05

这里的其他人为此提供了非常详细的代码。也许当时需要更详细的代码,我不知道。无论如何,我对其中一个投了赞成票,但这里有一个非常简化的版本,它的工作原理相同:

function openFile() {
  document.getElementById('inp').click();
}
function readFile(e) {
  var file = e.target.files[0];
  if (!file) return;
  var reader = new FileReader();
  reader.onload = function(e) {
    document.getElementById('contents').innerHTML = e.target.result;
  }
  reader.readAsText(file)
}
Click the button then choose a file to see its contents displayed below.
<button onclick="openFile()">Open a file</button>
<input id="inp" type='file' style="visibility:hidden;" onchange="readFile(event)" />
<pre id="contents"></pre>