2016-12-01 187 views
0

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

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

+1

你是如何生成zip文件的?你能不能简单地回应请求来生成压缩文件*和* zip文件。如果你这样做,保护zip文件并知道何时删除它会简单得多。 – idbehold

+0

我通过调用操作系统内置的zip命令行工具来生成zip文件。 –

回答

1

一个几句话,应可帮助您:

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

而且在客户端:

  1. 您创建一个按钮,导致端点在服务器上(触发AJAX调用或其他)。点击后,你在服务器上运行上面提到的逻辑。
  2. 作为回报,用户客户端获取生成的链接(领导到另一个端点处理这些只签链接),必须遵循下载的文件
  3. 使用任何类型的DOM操作,您创建隐藏<a/>标签与href导致这个链接,然后你触发自动点击JS链接中的这个链接。最好是,如果您支持新的浏览器,最好为其添加download属性。

请勿:

  • 将文件放在公用文件夹。创建将其内容流式传输到客户端的端点。为它创建一些临时目录。
  • 运行CRON作业以删除文件。或者仅在出现问题时运行才能清理旧文件。下载后文件应该被删除(你会知道,当你的流关闭时,你会得到一个适当的事件)。

实施意见

  1. 在服务器上创建两个端点(使用Express或任何框架路由)。一个用于请求文件(启动生成过程),另一个用于下载文件。
  2. 生成过程结束后,将.zip存储在例如temp目录并为其创建标记。
  3. 存储一组数据是这样的数据库对每次下载:
    • zip文件名
    • 令牌(如生成的随机哈希)
    • 时间戳产生的
  4. 通过新链接到客户端(用于下载过程的第二个端点)。客户端会自动初始化下载没有人际交往,上述
  5. 的建议当链接的代码“点击”,您的服务器接收的第二端点,然后另一个请求:
    • 检查令牌仍然有效(例如30秒)。
    • 如果不是:403或404
    • 若是:开始流式传输的数据(创建文件流和流式传输到客户端)
    • 流回时,包括具有响应,例如适当的标头文件名客户端应该看到(这将从temp目录掩盖你的内部文件名),使用Content-Disposition
  6. 流完成后,删除文件
  7. 创建将如执行cron作业每天一次,向数据库询问所有具有无效令牌(过期的)的文件,并尝试删除它们(如果它们存在,但这不应该是一种常见的情况,如果在流式传输完成时将它们正确删除) 。