我正在尝试提供一种纯脚本解决方案,用于通过浏览器读取客户端计算机上的文件内容。
我有一个适用于 Firefox 和 Internet Explorer 的解决方案。它不是很漂亮,但我现在只是在尝试:
function getFileContents() {
var fileForUpload = document.forms[0].fileForUpload;
var fileName = fileForUpload.value;
if (fileForUpload.files) {
var fileContents = fileForUpload.files.item(0).getAsBinary();
document.forms[0].fileContents.innerHTML = fileContents;
} else {
// try the IE method
var fileContents = ieReadFile(fileName);
document.forms[0].fileContents.innerHTML = fileContents;
}
}
function ieReadFile(filename)
{
try
{
var fso = new ActiveXObject("Scripting.FileSystemObject");
var fh = fso.OpenTextFile(filename, 1);
var contents = fh.ReadAll();
fh.Close();
return contents;
}
catch (Exception)
{
return "Cannot open file :(";
}
}
我可以调用 getFileContents()
,它将内容写入 fileContents
文本区域。
有没有办法在其他浏览器中执行此操作?
目前我最关心的是 Safari 和 Chrome,但我愿意接受任何其他浏览器的建议。
编辑:在回答“你为什么要这样做?”这个问题时:
基本上,我想在客户端对文件内容和一次性密码进行哈希处理,这样我就可以将此信息发回作为验证。
最佳答案
编辑以添加有关文件 API 的信息
由于我最初写了这个答案,File API已被提议作为标准和implemented in most browsers (从 IE 10 开始,它添加了对此处描述的 FileReader
API 的支持,但还不支持 File
API)。该 API 比旧的 Mozilla API 稍微复杂一些,因为它旨在支持异步读取文件、更好地支持二进制文件和不同文本编码的解码。有 some documentation available on the Mozilla Developer Network以及各种在线示例。您将按如下方式使用它:
var file = document.getElementById("fileForUpload").files[0];
if (file) {
var reader = new FileReader();
reader.readAsText(file, "UTF-8");
reader.onload = function (evt) {
document.getElementById("fileContents").innerHTML = evt.target.result;
}
reader.onerror = function (evt) {
document.getElementById("fileContents").innerHTML = "error reading file";
}
}
原始答案
在 WebKit(因此,Safari 和 Chrome)中似乎没有办法做到这一点。唯一的键 File对象有 fileName
和 fileSize
。根据commit message对于 File 和 FileList 支持,这些灵感来自 Mozilla's File object , 但它们似乎只支持部分功能。
如果您想更改此设置,您可以随时 send a patch到 WebKit 项目。另一种可能性是提议将 Mozilla API 包含在 HTML 5 中。 ; WHATWG邮件列表可能是最好的地方。如果你这样做,那么至少在几年后,更有可能有一种跨浏览器的方式来做到这一点。当然,提交补丁或提议以包含到 HTML 5 中确实意味着需要做一些捍卫这个想法的工作,但 Firefox 已经实现它的事实为您提供了一些起点。
关于javascript - 在各种浏览器中使用 javascript 在客户端读取文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/750032/