Javascript 检查本地文件是否已更改
我有一个web应用程序,用户可以使用html5选择一个本地文件作为输入。有什么方法可以检查文件是否已更改,这在现代浏览器中有效吗 过去,在某些浏览器中,可以通过轮询file对象并比较Javascript 检查本地文件是否已更改,javascript,filereader,fileapi,Javascript,Filereader,Fileapi,我有一个web应用程序,用户可以使用html5选择一个本地文件作为输入。有什么方法可以检查文件是否已更改,这在现代浏览器中有效吗 过去,在某些浏览器中,可以通过轮询file对象并比较file.lastModifiedDate(已弃用)或file.lastModified属性来实现这一点,如本QA中所述:。但是,该规范规定,lastModifiedDate和其他文件数据应该是该文件的快照,就像用户第一次选择它时的样子,因此这不应该起作用(而且似乎大多数浏览器的最新版本现在确实遵循了该规范,这使得这
file.lastModifiedDate
(已弃用)或file.lastModified
属性来实现这一点,如本QA中所述:。但是,该规范规定,lastModifiedDate
和其他文件数据应该是该文件的快照,就像用户第一次选择它时的样子,因此这不应该起作用(而且似乎大多数浏览器的最新版本现在确实遵循了该规范,这使得这种攻击不可用)
我希望能够通过读取文件来检查更改。这种方法是可行的,但一旦文件在磁盘上被更改,Chrome和Firefox就会抛出一个错误,称为DomeException:无法读取请求的文件,这通常是由于获取文件引用后出现的权限问题代码>有办法解决这个问题吗
这就是我所尝试的:
let oldText
setInterval(function () {
const fileObj = document.getElementById('myFileInput').files[0]
const reader = new FileReader()
reader.onload = evt => {
const text = evt.target.result
if (text !== oldText) {
console.log("The file has changed!")
oldText = text
}
}
reader.readAsText(fileObj)
}, 1000)
…或更简单:
const fileObj = document.getElementById('myFileInput').files[0]
const reader = new FileReader()
reader.readAsText(fileObj) // works
// now lets edit the file and try again
reader.readAsText(fileObj) // fails
reader.readAsText()
按预期工作,直到文件发生更改时抛出上述错误。我猜这是某种安全措施,尽管我不完全理解它试图保护用户免受什么影响。我能做些什么呢?如果在浏览器中实现API,这将再次成为可能。它将出现在谷歌Chrome 85中,计划于2020年10月发布
与FileReader API不同,它需要显式的用户交互,因此您可以执行以下操作:
myFileInput.addEventListener('change', async (e) => {
const fh = await window.chooseFileSystemEntries()
// fh is now a FileSystemFileHandle object
// Use fh.getFile() to get a File object
})
这是一项安全措施。您无能为力。规范中涉及在选择后文件更改时禁止读取的部分是.Chrome,是的,这可能意味着Edge(>v44),但它目前看起来不太适合,也不适合Safari-|