我编写了一个基于网络的小型工具,它使用文件输入来读取不断变化的文件。用户手动选择它(一次!),JavaScript 会跟踪它的更改时间(上次文件修改时间和文件大小)。如果已更改,则会再次读取文件内容。
这在 Windows 上的所有浏览器中都可以正常工作。但在 macOS 上(在 Safari 10.1.2 和 Firefox 51.0.1 中测试)似乎只有最后修改时间被更新。文件大小未更新,似乎也无法再读取文件内容。因此我无法在 macOS 上的浏览器中跟踪文件更改。
但为什么?这是 macOS 中的安全限制吗?
请使用以下代码片段进行测试。选择一个文件(例如文本文件),查看上次修改的时间戳和文件大小,然后更改文件并再次查看大小是否已更改。在 macOS 上,文件大小不会改变。
请不要使用 jQuery。
window.addEventListener('load', function() {
window.setInterval(function() {
var logFile = document.querySelector('#file').files[0];
if (logFile) {
document.querySelector('#info').innerHTML = '<br/>' +
(new Date()).toString() + '<br/>Last modified: ' +
logFile.lastModified +
'<br/>Size: ' +
logFile.size;
}
}, 1000);
});
#info {
font-family: Courier;
font-size: 0.9em;
}
<!DOCTYPE html>
<input type="file" id="file" />
<p id="info"></p>
我不认为这是一种安全措施,而不仅仅是一种性能措施。
一旦他们获得了文件元数据信息,他们将不再请求它以进一步获取=>更少的用户磁盘访问权限。
说实话,我什至有点惊讶在 Windows 上他们每次都会请求这些元数据。
要解决这个问题,并不是一件容易的事,我会重新考虑对此的需求,以及如果消息传递无法在另一个级别完成(例如,从确实修改文件的进程)。
事实上,Firefox 和 Safari 在这种情况下的行为并不相同:
一旦您从输入中选择了该文件,Safari 似乎就会创建一个指向该文件的 blobURI,并且当您稍后尝试访问它时(例如从 FileReader)总是使用它。这里真正的问题是我们无法在磁盘上获取新版本,因为无论出于何种原因,这个 blobURI 似乎都不是真正的pointer到磁盘...但是如果我们只想检测文件更改,那么这对我们有好处,因为我们只需要检查FileReader.onerror
事件,即使有File.slice(0,1)
(即最小 I/O)。
另一方面,Firefox 会触发 FileReader 的错误only如果缓存的元数据的大小与已读取的元数据的大小不匹配。这意味着您必须在每次检查时读取整个文件,并且如果没有发生错误,请仔细检查数据是否实际上相同......But,在此浏览器中,您仍然可以使用 blobURI 从 AJAX 获取磁盘上的实际文件,以获得最新版本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)