生成可下载的文件链接并自动启动下载
问题描述:
用户通过按网页上的按钮在我的节点js服务器上生成文件。 服务器然后创建一个.zip文件。 我想公开这个zip文件,以便它可以自动下载到用户的客户端。 下载完成后,我希望服务器检测到下载完成并删除zip文件。生成可下载的文件链接并自动启动下载
1-如何在节点js中公开文件?系统应该把它放在公共文件夹中吗?这意味着这将是安全风险,任何人都可以阅读它。我如何链接到一个文件&使它可下载不在公共文件夹中? 2-如何检测下载是否完成?我应该运行一个cron作业来删除这些文件而不必担心下载过程吗?
答
一个几句话,应可帮助您:
- 如果要创建临时文件,一个好的做法是创建签署网址。这些是包含特定标记的URL,该标记在有限的时间内有效。实现很简单 - 生成文件.zip和令牌,最好在数据库中设置时间戳,并使用令牌构建带符号的链接。如果文件未在给定的时间内被客户端下载,则该文件无效。
- Zip文件应该有唯一的名称,最好是一些随机的名称(如果这不是问题,您仍可以使用名为
Content-Disposition
的标题在下载过程中决定其名称)。您将它存储在项目中的TEMP目录中。 - 用户点击之前生成的带有与该文件相关的令牌的已签名链接后,即可开始下载(流式传输)。流式传输完成后(请参阅NodeJS流库),您只需删除该文件即可。
而且在客户端:
- 您创建一个按钮,导致端点在服务器上(触发AJAX调用或其他)。点击后,你在服务器上运行上面提到的逻辑。
- 作为回报,用户客户端获取生成的链接(领导到另一个端点处理这些只签链接),必须遵循下载的文件
- 使用任何类型的DOM操作,您创建隐藏
<a/>
标签与href
导致这个链接,然后你触发自动点击JS链接中的这个链接。最好是,如果您支持新的浏览器,最好为其添加download
属性。
请勿:
- 将文件放在公用文件夹。创建将其内容流式传输到客户端的端点。为它创建一些临时目录。
- 运行CRON作业以删除文件。或者仅在出现问题时运行才能清理旧文件。下载后文件应该被删除(你会知道,当你的流关闭时,你会得到一个适当的事件)。
实施意见
- 在服务器上创建两个端点(使用Express或任何框架路由)。一个用于请求文件(启动生成过程),另一个用于下载文件。
- 生成过程结束后,将.zip存储在例如
temp
目录并为其创建标记。 - 存储一组数据是这样的数据库对每次下载:
- zip文件名
- 令牌(如生成的随机哈希)
- 时间戳产生的
- 通过新链接到客户端(用于下载过程的第二个端点)。客户端会自动初始化下载没有人际交往,上述
- 的建议当链接的代码“点击”,您的服务器接收的第二端点,然后另一个请求:
- 检查令牌仍然有效(例如30秒)。
- 如果不是:403或404
- 若是:开始流式传输的数据(创建文件流和流式传输到客户端)
- 流回时,包括具有响应,例如适当的标头文件名客户端应该看到(这将从
temp
目录掩盖你的内部文件名),使用Content-Disposition
- 流完成后,删除文件
- 创建将如执行cron作业每天一次,向数据库询问所有具有无效令牌(过期的)的文件,并尝试删除它们(如果它们存在,但这不应该是一种常见的情况,如果在流式传输完成时将它们正确删除) 。
你是如何生成zip文件的?你能不能简单地回应请求来生成压缩文件*和* zip文件。如果你这样做,保护zip文件并知道何时删除它会简单得多。 – idbehold
我通过调用操作系统内置的zip命令行工具来生成zip文件。 –