我不确定是否可以问这个问题,所以请随意将我的问题移到别处或关闭它。
有人告诉我,只有当浏览器上发生诸如拖放之类的显式事件并为其提供文件句柄时,Javascript 才能从磁盘写入和读取。
在 Mega(例如上传)的情况下,当您点击下载时,您直接将文件保存到磁盘,而无需保存或安装任何浏览器扩展程序。
它是 Javascript 还是 HTML 5 的一个特性,因为在我看来,在这种情况下这意味着一个可怕的安全问题。
编辑 1:
所以我的问题是,Mega 如何在不向您显示浏览器的 Save to
对话框弹出并自行确定文件放置位置的情况下写入磁盘
问题有些含糊,要正确回答,我们可能需要有关您的系统和浏览器 vendor/版本的更多信息。 Mega 使用一些非常酷的东西来处理下载和文件。
他们根据客户端环境使用:
- 文件系统 API(Chrome/Firefox 扩展 polyfill);
- Adobe Flash SWF Filewriter(旧浏览器的回退);
- BlobBuilder (IE10/IE11);
- MEGA Firefox 扩展(已弃用);
- 基于数组缓冲区/Blob 内存;
- MediaSource(实验性流媒体解决方案);
- 基于 IndexedDB blob(Firefox 20+)。
使用所有这些方法,无需用户干预/授权直接下载将依赖于浏览器的兼容性。我在 Linux 上使用 Firefox,当我从 Mega 中选择一个文件并单击下载时,会出现一个对话框,因此,实际上,我必须授权下载。但是如果你看this screnshot ,在“来自”字段中,您会看到“blob”一词,这是 Blob object 的标志来自 File API W3C Specification .
您可以查看 Blob API 使用示例 in this fiddle和检查Mega's source code (案例 4:基于 Arraybuffer/Blob 内存,第 15、293、324、802 行)。
window.URL = window.URL || window.webkitURL;
var blobExample = new Blob(['\
<!doctype html>\n\
<html>\n\
<body>Hello from Blob file!</body>\n\
</html>'], {type: 'text/html'});
var blobLink = document.createElement('link');
blobLink.rel = 'html';
blobLink.href = window.URL.createObjectURL(blobExample);
document.body.appendChild(blobLink);
var anchor = document.createElement('a');
anchor.href = window.URL.createObjectURL(blobExample);
anchor.download = 'blob-example.html';
anchor.textContent = 'Download the binary large object';
document.body.appendChild(anchor);
=)