Mega如何在不需要许可的情况下将文件保存到硬盘驱动器

时间:2014-01-09 12:06:49

标签: javascript php html5 security

我不确定问这个问题的地方是否可以随意将我的问题转移到别处或关闭它 有人告诉我,Javascript只有在像drag& amp ;;这样的显式事件时才能从磁盘写入和读取。 drop在浏览器上发生,并为它提供了一个文件句柄。

如果您点击下载Mega(ex upload),则直接将文件保存到磁盘,而不会被要求保存或安装浏览器的任何扩展名。
它是Javascript还是HTML 5的一个功能,因为在我看来这意味着在这种情况下可怕的安全问题。

编辑1: 所以我的问题是,Mega如何设法在磁盘上写入而不显示您弹出的浏览器的Save to对话框并自行确定放置文件的位置

3 个答案:

答案 0 :(得分:10)

问题有些模糊,要正确回答,我们可能需要有关您的系统和浏览器供应商/版本的更多信息。 Mega使用一些非常酷的东西来处理下载和文件。

他们使用,取决于客户端环境:

  • Filesystem API(Chrome / Firefox Extension polyfill);
  • Adob​​e Flash SWF Filewriter(旧浏览器的后备);
  • BlobBuilder(IE10 / IE11);
  • MEGA Firefox Extension(已弃用);
  • Arraybuffer / Blob Memory Based;
  • MediaSource(实验性流媒体解决方案);
  • 基于IndexedDB blob(Firefox 20 +)。

使用所有这些方法,直接下载而无需用户干预/授权将依赖于浏览器兼容性。我在Linux上使用Firefox,当我从Mega中选择一个文件并点击下载时,会出现一个对话框,因此,我必须授权下载。但是,如果您查看this screnshot,则在“来自”字段中,您会看到“blob”一词,这是Blob objectFile 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);

=)

答案 1 :(得分:3)

奇怪......我每天都在使用Mega,它总是会显示Save to对话框。这取决于您的浏览器设置吗?

我没有足够的声誉来添加评论,因此我不得不将此作为答案发布,对不起。

答案 2 :(得分:0)

这只是在响应中发送正确的标题 - 所以浏览器知道保存而不是打开。这与javascript或HTML5无关。

例如,在PHP中:

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file).'"'); 
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));

我不知道Mega使用的服务器端技术,但这是基本前提。

编辑以回应您编辑的问题,该问题是为什么“另存为”对话框未显示,这是一个浏览器设置。例如,Chrome会默认保存到您的“下载”文件夹(在Windows上)而不会提示。