一尘不染

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

javascript

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

仅仅依靠在服务器上记录/处理文件下载 请求 是不够的-我需要确定性地知道文件何时完成以及在客户端是否就位,因为我的许多用户都在频繁掉线的环境中工作。

最有效的方法是,浏览器从“另存为…”对话框中暴露出一个“文件已保存”事件,该事件可能会链接到下载页面上的JavaScript函数(该事件可以发回到服务器上)。但是,直觉表明,如果浏览器公开了此功能,则可能会存在安全漏洞,因为它会在沙盒外潜入。我不确定这是否有可能。

有任何想法吗?

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

编辑2:
我的“安全性”措辞误导了人们,使他们陷入离题的技术安全性问题,但是你们两个都证实了我的怀疑,即“不,对此不存在浏览器支持”。我正在用答案标记第一位评论者,因为他的第一句话符合我的要求。谢谢大家


阅读 278

收藏
2020-05-01

共1个答案

一尘不染

JavaScript中没有这种浏览器事件,即使您不信任用户的浏览器也无法为您提供安全性。

最好使用GUID为每次下载生成唯一的URL。然后,您可以例如:

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

让我澄清一下最后一个项目符号。假设你使用的是Java-你会in.read(buffer)out.write(buffer)一个循环,直到EOF。如果客户端断开连接,您将收到一个IOExceptionout.write()并且可以告诉您从中断的客户端下载成功。在其他平台上,我敢肯定有办法判断连接是否丢失。

2020-05-01