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

时间:2010-08-27 09:00:56

标签: javascript

我尝试用

打开文件
window.open("file:///D:/Hello.txt");

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

10 个答案:

答案 0 :(得分:204)

以下是使用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 :(得分:57)

HTML5 fileReader facility允许您处理本地文件,但这些文件必须由用户选择,您无法查找用户磁盘查找文件。

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

答案 2 :(得分:18)

因为我没有生命而且我想要那4个声望点,所以我可以表达我的爱(赞成答案)真正擅长编码的人我已经分享了我对Paolo Moretti代码的改编。只需使用Try This import hashlib user = input("Enter text here ") h = hashlib.md5(user.encode()) h2 = h.hexdigest() print(h2) 函数执行文件内容作为第一个参数 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)
}

答案 3 :(得分:1)

这里的其他人为此提供了非常详尽的代码。我不知道,那时可能需要更详细的代码。无论如何,我赞成其中之一,但这是一个非常简化的版本,其工作原理相同:

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>

答案 4 :(得分:1)

考虑将文件重新格式化为javascript。 然后,您可以简单地使用旧版本加载它...

AdapterViewFlipper

答案 5 :(得分:0)

尝试

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

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

async function read(e) {
  msg.innerText = await readFile(e.target.files[0]);
}
<input type="file" onchange="read(event)"/>
<h3>Content:</h3><pre id="msg"></pre>

答案 6 :(得分:0)

如果 Blob 足够好,这里是如何在打字稿中做到这一点(对于许多用例,无需通过 FileReader 转换为 ByteArray/String)

function readFile({
  fileInput,
}: {
  fileInput: HTMLInputElement;
}): Promise<ArrayLike<Blob>> {
  return new Promise((resolve, reject) => {
    fileInput.addEventListener("change", () => {
      resolve(fileInput.files);
    });
  });
}

这里是如何在 vanilla javascript 中做到这一点

function readFile({
  fileInput,
}) {
  return new Promise((resolve, reject) => {
    fileInput.addEventListener("change", () => {
      resolve(fileInput.files);
    });
  });
}

答案 7 :(得分:-4)

xmlhttp请求方法对本地磁盘上的文件无效,因为浏览器安全性不允许我们这样做。但是我们可以通过创建快捷方式 - >右键单击&gt;属性来覆盖浏览器安全性。 “...浏览器位置path.exe”附加--allow-file-access-from-files。这是在chrome上测试的,但是应该注意应该关闭所有浏览器窗口并且应该从浏览器运行代码通过这个快捷方式打开。

答案 8 :(得分:-7)

你做不到。 Firefox,Safari等新浏览器会阻止“文件”协议。它只适用于旧浏览器。

您必须上传所需的文件。

答案 9 :(得分:-7)

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

现在txt包含文件abc.txt的内容。