生成可下载的文件链接并自动启动下载

时间:2016-12-01 17:16:58

标签: javascript node.js express

用户通过按网页上的按钮在我的节点js服务器上生成文件。 然后,服务器创建.zip文件。 我想公开这个zip文件,以便它可以自动下载到用户的客户端。 下载后,我希望服务器检测到下载完成并删除zip文件。

1-如何在节点js中公开文件?系统应该把它放在公共文件夹中吗?这意味着它将存在安全风险,任何人都可以阅读它。如何链接到文件&使它可以下载,不在公共文件夹中? 2-如何检测下载完成?我应该运行一个cron作业来删除文件而不用担心下载进度吗?

1 个答案:

答案 0 :(得分:1)

一些可以帮助你的评论:

  1. 如果您要创建临时文件,最好的做法是创建已签名网址。这些是包含在有限时间内有效的特定令牌的URL。实现是微不足道的 - 生成文件.zip和令牌,最好在DB中设置时间戳,并使用令牌构造带符号的链接。如果客户端在给定的时间内未下载该文件,则该文件无效。
  2. Zip文件应该具有唯一的名称,最好是一些随机的名称(如果它不是问题,您仍然可以使用名为Content-Disposition的标题在下载期间决定其名称)。您将它存储在项目内的TEMP目录中。
  3. 用户点击以前生成的带有与该文件相关的令牌的签名链接后,即可开始下载(流式传输)。流式传输完成后(请参阅NodeJS流lib),您只需删除该文件。
  4. 在客户端:

    1. 您创建一个通向服务器端点的按钮(触发AJAX调用或其他)。单击后,您将在服务器上运行上述逻辑。
    2. 作为回报,用户客户端获得生成的链接(通向另一个端点,仅处理那些已签名的链接),必须遵循该链接才能下载文件
    3. 使用任何类型的DOM操作,您可以使用<a/>创建隐藏的href标记,从而导致此链接,然后触发JS代码中此链接的自动点击。最好是,如果您支持新版浏览器,最好为其添加download属性。
    4. 请勿:

      • 将文件放在公用文件夹中。创建将其内容流式传输到客户端的端点。为它创建一些临时目录。
      • 运行CRON作业以删除文件。或者仅在出现故障时运行它,以清理旧文件。文件应在下载后删除(您将知道,因为当您的信息流关闭时,您将获得正确的活动)。

      实施建议

      1. 在服务器上创建两个端点(使用Express或任何框架进行路由)。一个用于请求文件(开始生成过程),另一个用于下载文件。
      2. 生成过程完成后,将.zip存储在例如temp目录并为其创建令牌。
      3. 在每次下载的数据库中存储这样的数据集:
        • zip文件名
        • 令牌(例如生成的随机哈希)
        • 代的时间戳
      4. 将新链接传递给客户端(用于下载过程的第二个端点)。如上所述,客户应自动初始化下载而无需人工干预
      5. 当链接被&#34;点击&#34;通过代码,您的服务器在第二个端点上接收另一个请求,然后:
        • 检查令牌是否仍然有效(例如30秒)。
        • 如果不是:403或404
        • 如果是:开始流式传输数据(创建文件流并将其流式传输到客户端)
        • 当流回来时,包括带有响应的正确标题,例如客户端应该看到的文件名(这将使temp目录中的内部文件名模糊不清),使用Content-Disposition
      6. 完成流式传输后,删除文件
      7. 创建将运行的CRON作业,例如每天一次,向DB询问所有具有无效令牌(过期的)的文件,并尝试删除它们(如果它们存在)(但这不应该是常见的情况,如果在流式传输结束时正确删除它们)