代码之家  ›  专栏  ›  技术社区  ›  David Pope

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

  •  19
  • David Pope  · 技术社区  · 14 年前

    我有敏感文件要下载给用户,每个用户都可以 下载 一个给定的文件正好一次。如果下载失败,我希望允许重新下载,但不允许重新下载。

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

    最简单的方法是,如果浏览器从另存为中暴露了一个“文件已保存”事件…可以连接到下载页面上的javascript函数的对话框(可以发布回服务器)。但是,直觉告诉我们,如果浏览器暴露了这个功能,可能会有安全漏洞,因为它在沙盒之外有所潜入。我不确定这是否可能。

    found several other questions in this area 但是这个问题没有特别的。

    有什么想法吗?

    编辑: 我不应该在最初的问题中使用“安全”这个词,很抱歉触发了红鲱鱼。

    编辑2: 我的“安全”一词误导了人们对非主题技术安全问题的理解,但你们两个都证实了我的怀疑,“不,没有浏览器支持这一点。”我在给第一个评论人打上答案,因为他的第一句话有我要找的内容。谢谢大家。

    3 回复  |  直到 14 年前
        1
  •  9
  •   Community Mr_and_Mrs_D    7 年前

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

    最好使用一个guid为每个下载生成一个唯一的url。例如,您可以:

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

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

    编辑: 实际上,您可以使用在 one of the questions you linked to . 但是,这并不是限制下载数量的可靠解决方案。

        2
  •  17
  •   Jesse Taber    9 年前

    这是一个很好的解决方案:

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

    它基本上是通过在下载文件的响应头中设置一个cookie来工作的,因此javascript可以定期检查这个cookie的存在…

        3
  •  1
  •   Seth Petry-Johnson    14 年前

    为什么文件可以“完全下载一次”很重要?一旦文件被下载,它就可以被复制,那么允许 同一用户 多次下载文件?

    如果没有,你能这样做吗?

    1. 生成用于下载给定文件的唯一URL。(如有必要,请使用guid废弃)
    2. 将该URL与用户信息(浏览器类型、IP地址等)和时间窗口相关联。只允许从该用户和窗口中下载。
    3. 窗口应该足够长,以便用户注意到传输失败,并重新尝试一次或两次,但不会再尝试。

    最终结果是:

    1. 您可以合理地确定该文件仅由目标收件人下载。
    2. 您可以确保收件人只能在短时间内下载该文件。
    3. 同一个用户可以多次下载该文件,但谁在乎呢?这与制作第一个文件的本地副本没什么不同。

    如果你真的很担心,记录下每一个下载请求,并为下载了不止一次的文件运行一个计划报告。如果任何事情看起来可疑,那么您可以检查安全日志,与用户交谈等。