下载的文件保存到磁盘时的浏览器事件

我有敏感的文件下载给用户,并允许每个用户只下载一个给定的文件一次。 如果下载失败,我想允许重新下载,但不能以其他方式。

在服务器上依靠日志logging/处理文件下载请求是不够的 – 我需要确定文件何时完成并在客户端就位,因为我的许多用户在频繁连接下降的环境中工作。

如果浏览器暴露了“另存为…”对话框中的“文件保存”事件,该对话框可能会连接到下载页面上的JavaScript函数(可能会回传到服务器),那么最直接的方法就是使用这种方法。 但是,直觉表明,如果浏览器暴露了这个function,那么可能存在安全漏洞,因为它在沙盒之外有些潜行。 我不确定这是甚么可能的。

我在这方面 发现 了 其他 几个 问题 ,但没有具体说明这个问题。

有任何想法吗?

编辑:我不应该在原来的问题中使用“安全”一词,对不起,引发红鲱鱼。

编辑2:我的“安全”措辞误导人们到异类的技术安全问题,但你们都证实了我的怀疑,“不,没有浏览器的支持。 自从他的第一句话以来,我正在给第一位评论者提供答案。 谢谢大家。

JavaScript中没有这样的浏览器事件,即使您不能相信用户的浏览器为您提供安全性。

您最好使用GUID为每个下载生成一个唯一的URL。 那么你可以举个例子:

  • 让url只在特定时间段有效
  • 只允许从与唯一URL关联的特定IP地址进行传输
  • 让您的服务器端代码检测何时完全传输唯一URL的内容,然后使URL无效。

让我澄清最后一颗子弹。 假设你正在使用Java,你将在一个循环中in.read(buffer)out.write(buffer) ,直到EOF。 如果客户端断开连接,您将在out.write()过程中收到一个IOException ,并能够从中断的成功下载成功。 在其他平台上,我确信有方法可以判断连接是否丢失。

编辑:你实际上可以使用你所链接的问题之一的接受答案中概述的技巧来触发浏览器事件。 然而,这不会是限制下载次数的可靠解决scheme。

这是一个很好的解决scheme:

http://gruffcode.com/2010/10/28/detecting-the-file-download-dialog-in-the-browser/

它基本上是通过在下载的文件的响应头中设置一个cookie,所以JavaScript定期检查这个cookie的存在…

为什么重要的是文件可以下载“一次”? 一旦文件被下载,它可以被复制,所以是否真的有一个安全问题让同一个用户多次下载文件?

如果没有,你可以做这样的事情:

  1. 生成一个唯一的URL来下载给定的文件。 (如果需要,使用GUID进行填充)
  2. 将该URL与用户信息(浏览器types,IP地址等)和时间窗口相关联。 只允许从该用户和窗口期间下载。
  3. 窗口应该足够长,以便用户注意到传输失败,并重新尝试一次或两次,但不再。

最终的结果是:

  1. 您可以合理确定该文件只是由预期的收件人下载。
  2. 您可以确定收件人只能在短时间内下载文件。
  3. 同一个用户可以不止一次下载这个文件,但是谁在乎呢? 这与制作第一个文件的本地副本没有区别。

如果您真的担心,请logging每个下载请求,并针对不止一次下载的文件运行计划报告。 如果有什么看起来很腥,你可以检查安全日志,与用户交谈等。