gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:31:41 25 4
gpt4 key购买 nike

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

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

最佳答案

一些对您有帮助的评论:

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

在客户端:

  1. 您创建一个通向服务器上端点的按钮(触发 AJAX 调用或其他)。点击后,在服务器上运行上述逻辑。
  2. 作为返回,用户客户端会获取生成的链接(指向仅处理这些签名链接的另一个端点),必须遵循该链接才能下载文件
  3. 使用任何类型的 DOM 操作,您都可以创建隐藏的 <a/>标记为 href指向这个链接,然后在 JS 代码中触发自动点击这个链接。最好,如果您支持新的浏览器,最好添加 download归因于它。

不要:

  • 将文件放入公共(public)文件夹中。创建将其内容传输到客户端的端点。为其创建一些临时目录。
  • 运行 CRON 作业来删除文件。或者仅在出现故障时才运行它来清理旧文件。文件下载后应将其删除(您会知道这一点,因为当您的流关闭时,您将收到适当的事件)。

实现建议

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

关于javascript - 生成文件的可下载链接并自动启动下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40916613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com