这个问题有两种解决方案,但<input type="file">
不是其中一种。根据规范,它会创建文件的“快照”。
本地文件系统
这个api是实验性的,需要在闪烁中启用标志(又名铬浏览器)。这个想法是你得到一个文件句柄,当你需要这个文件时,你调用异步“getFile”函数来检索实际文件。
此功能是一项“强大功能”,需要您的网站安全,并且无法在沙盒 iframe 中运行。
所以这里没有测试是一些“黑暗中的代码”:
async function pickFile () {
const handle = showOpenFilePicker()
let lastModificationTime = 0
async function compare () {
const file = await handle.getFile()
if (file.lastModified > lastModificationTime) {
lastModificationTime = +file.lastModified
console.log(await file.text())
}
}
setInterval(compare, 1000)
}
从拖放中获取条目
与本机文件系统类似,您也可以检索文件句柄并执行相同的操作,但此功能目前适用于所有浏览器。但是这个代码片段在 stackoverflow 中不起作用,因为它使用了一些沙箱,使它不兼容,所以这里是一个几乎没有评论的小提琴
function drop(event) {
event.stopPropagation();
event.preventDefault();
const fileEntry = event.dataTransfer.items[0].webkitGetAsEntry()
let lastModificationTime = 0
async function read (file) {
console.log(await file.text())
}
function compare (meta) {
if (meta.modificationTime > lastModificationTime) {
lastModificationTime = meta.modificationTime
fileEntry.file(read)
}
}
setInterval(fileEntry.getMetadata.bind(fileEntry, compare), 1000)
}
编辑:现在还有一种方法可以将拖放文件作为 FileSystemFileHandle 使用,它更适合使用
elem.addEventListener('dragover', evt => {
evt.preventDefault()
})
elem.addEventListener('drop', async evt => {
evt.preventDefault()
for (const item of evt.dataTransfer.items) {
if (item.kind === 'file') {
const entry = await item.getAsFileSystemHandle();
if (entry.kind === 'file') {
}
}
}
})