Javascript HTML5文件API中的FileReader.readAsText是如何工作的?
我使用HTML5文件API编写了以下代码来检查上传的文件是否存在Javascript HTML5文件API中的FileReader.readAsText是如何工作的?,javascript,html,drag-and-drop,textarea,fileapi,Javascript,Html,Drag And Drop,Textarea,Fileapi,我使用HTML5文件API编写了以下代码来检查上传的文件是否存在 添加文档 FileReaderload事件异步设置.result值。要访问.result请使用load或loadend事件 当在选择文件或浏览…用户界面上选择文件时,删除本地文件系统中的文件不应影响调用返回的文件列表中的文件对象。见 每个快照都必须有一个内部的快照状态,该状态 最初必须设置为基础存储的状态(如果有) 这样的底层存储是存在的,必须通过 . 更多的规范性定义可参见s 这个猴子补丁将在适当的时候被移除。看 Bl
添加文档
FileReader
load
事件异步设置.result
值。要访问.result
请使用load
或loadend
事件
当在
选择文件
或浏览…
用户界面上选择文件时,删除本地文件系统中的文件不应影响调用返回的文件列表
中的文件
对象。见
每个快照都必须有一个内部的快照状态,该状态
最初必须设置为基础存储的状态(如果有)
这样的底层存储是存在的,必须通过
. 更多的规范性定义可参见s
这个猴子补丁将在适当的时候被移除。看
Blob
对象被删除
给定targetRealm并忽略内存,每个Blob
对象的[[]]内部方法必须运行以下步骤:
如果是这样,那么抛出一个
在targetRealm中返回此的新实例,对应于
相同的基础数据
对象是
给定每个文件列表
对象的[[Clone]]
内部方法
targetRealm和内存必须运行以下步骤:
让输出为targetRealm中的新文件列表
对象
对于此中的每个文件,是否添加<将代码>[StructuredClone][15](\u文件、targetRealm、内存)
添加到对象列表的末尾
产量
返回输出
在webkit和firefox浏览器上选择只读文件或文件夹 在chrome上,chrome如果在本地文件系统中为文件设置了只读权限,并且用户选择了
元素中的文件,其中文件阅读器
用于读取文件,则会在文件阅读器
上抛出一个错误,该错误由文件阅读器
进度事件生成
如果将Blob URL
设置为同一文件对象,则Blob:
URL不会根据请求将只读文件返回到Blob URL
选择文件夹权限设置为只读的文件夹
铬,铬
在chrome上,chrome设置了webkitdirectory
属性,并以event.target.files的.length
只读权限选择文件夹event.target.files.webkitGetAsEntry()
未调用,“未选择任何文件”
在
阴影DOM中呈现。当文件夹放置在
或设置了可放置属性的元素处时,只读文件夹的目录.name
和.path
将显示在放置事件中。数据传输
当用户在
元素处放置文件或文件夹时,在调用卸载之前,不会附加任何放置
事件事件,并且在UI上显示prompr
漏洞、安全问题
*尼克斯
当用户在
元素中删除文件夹时,如果没有附加删除
事件,则会显示用户文件系统文件:
协议中文件夹的完整路径。文件夹中包含的文件路径也未设置为.value
;e、 g
"file:///home/user/Documents/Document/"
当在
元素中删除文件时,如果附加了notdrop
事件,则用户文件系统中文件的完整路径设置为.value
of
;就是
"file:///home/user/Documents/Document/MyFileFullPathDisplayedAtTextAreaValue.txt"
如果在
元素中选择并删除多个文件,则所有完整文件路径都设置为
的.value
,由新行字符\n
"file:///home/user/Documents/Document/MyFileFullPathDisplayedAtTextAreaValue1.txt"
"file:///home/user/Documents/Document/MyFileFullPathDisplayedAtTextAreaValue2.txt"
..
其中,为文件路径创建了一个XMLHttpRequest()
,并在控制台上记录错误
NS_ERROR_DOM_BAD_URI: Access to restricted URI denied
当将
元素的
设置为.src
且.crossOrigin
设置为“匿名”
时,将调用img
错误
事件处理程序
在调用window.open()
时,在第一个参数处设置完整路径
规范
由于历史原因,IDL属性在
带有字符串“C:\fakepath\
”的文件名。一些遗留用户代理
实际上包含完整路径(这是一个安全漏洞)。
因此,从值
IDL获取文件名
属性以向后兼容的方式是非常重要的
文件名
获取时,它必须返回字符串“C:\fakepath\”,后跟列表中第一个文件的名称(如果有),或者如果列表为空,则返回空字符串。在…上
设置,如果新值为空字符串,则必须清空列表
所选文件的数量
;否则,它必须抛出一个“InvalidStateError
”
DOMException
注意:这一“伪造路径”要求是历史上的一次悲惨事故。有关更多信息,请参见状态部分中的示例
信息
注意:由于所选文件列表中的文件名中不允许使用路径组件
,因此“\fakepath\
”不能出错
对于路径组件
路径组件
当
元素的类型
属性位于文件上载中时
声明,本节中的规则适用
元素包含选定文件的列表
,
每个文件包含一个文件名、一个文件名
"file:///home/user/Documents/Document/MyFileFullPathDisplayedAtTextAreaValue1.txt"
"file:///home/user/Documents/Document/MyFileFullPathDisplayedAtTextAreaValue2.txt"
..
NS_ERROR_DOM_BAD_URI: Access to restricted URI denied
Error: Access to '"file:///home/user/Documents/Document/MyFileFullPathDisplayedAtTextAreaValue.png"' from script denied
data:text/html,<textarea></textarea>
<!DOCTYPE html>
<html>
<head>
<style>
body {
height: 400px;
}
textarea {
width: 95%;
height: inherit;
}
</style>
<script>
window.onload = function() {
var button = document.querySelector("#myfile + button");
var input = document.getElementById("myfile");
var display = document.getElementById("DisplayText");
var text = null;
function readFullPathToFileOnUserFileSystem(e) {
var path = e.target.value;
console.log(path);
var w = window.open(path, "_blank");
var img = new Image;
img.crossOrigin = "anonymous";
img.onload = function() {
document.body.appendChild(this);
}
img.onerror = function(err) {
console.log("img error", err.message)
}
img.src = path;
var request = new XMLHttpRequest();
request.open("GET", path.trim(), true);
request.onload = function() {
console.log(this.responseText)
}
request.error = function(err) {
console.log(err.message)
}
request.send();
}
display.addEventListener("input", readFullPathToFileOnUserFileSystem);
input.addEventListener("change", addDoc);
input.addEventListener("progress", function(event) {
console.log("progress", event)
});
button.addEventListener("click", handleText)
function addDoc(event) {
var mozResult = [];
function mozReadDirectories(entries, path) {
console.log("dir", entries, path);
return [].reduce.call(entries, function(promise, entry) {
return promise.then(function() {
console.log("entry", entry);
return Promise.resolve(entry.getFilesAndDirectories() || entry)
.then(function(dir) {
console.log("dir getFilesAndDirectories", dir)
return dir
})
})
}, Promise.resolve())
.catch(function(err) {
console.log(err, err.message)
})
.then(function(items) {
console.log("items", items);
var dir = items.filter(function(folder) {
return folder instanceof Directory
});
var files = items.filter(function(file) {
return file instanceof File
});
if (files.length) {
console.log("files:", files, path);
mozResult = mozResult.concat.apply(mozResult, files);
}
if (dir.length) {
console.log(dir, dir[0] instanceof Directory, dir[0]);
return mozReadDirectories(dir, dir[0].path || path);
} else {
if (!dir.length) {
return Promise.resolve(mozResult).then(function(complete) {
return complete
})
}
}
})
.catch(function(err) {
console.log(err)
})
};
console.log("files", event.target.files);
if ("getFilesAndDirectories" in event.target) {
return (event.type === "drop" ? event.dataTransfer : event.target)
.getFilesAndDirectories()
.then(function(dir) {
if (dir[0] instanceof Directory) {
console.log(dir)
return mozReadDirectories(dir, dir[0].path || path)
.then(function(complete) {
console.log("complete:", complete);
event.target.value = null;
});
} else {
if (dir[0] instanceof File && dir[0].size > 0) {
return Promise.resolve(dir)
.then(function(complete) {
console.log("complete:", complete);
})
} else {
if (dir[0].size == 0) {
throw new Error("could not process '" + dir[0].name + "' directory" + " at drop event at firefox, upload folders at 'Choose folder...' input");
}
}
}
}).catch(function(err) {
console.log(err)
})
}
var reader = new FileReader();
reader.onload = function(e) {
text = reader.result;
console.log("FileReader.result", text);
button.removeAttribute("disabled");
}
reader.onerror = function(err) {
console.log(err, err.loaded, err.loaded === 0, file);
button.removeAttribute("disabled");
}
reader.onprogress = function(e) {
console.log(e, e.lengthComputable, e.loaded, e.total);
}
reader.readAsArrayBuffer(file);
}
function handleText() {
// do stuff with `text`: `reader.result` from `addDoc`
display.textContent = text;
button.setAttribute("disabled", "disabled");
// set `text` to `null` if not needed or referenced again
text = null;
}
}
</script>
</head>
<body>
<input type="file" id="myfile" webkitdirectory directory allowdirs>
<button type="button" disabled>Add Document</button>
<br>
<br>
<textarea id="DisplayText"></textarea>
</body>
</html>
instanceOfFileReader.readAsText(blob[, encoding]);