Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 生成指向文件的可下载链接并自动启动下载_Javascript_Node.js_Express - Fatal编程技术网

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

Javascript 生成指向文件的可下载链接并自动启动下载,javascript,node.js,express,Javascript,Node.js,Express,用户通过按下网页上的按钮在my node js服务器上生成文件。 然后服务器创建一个.zip文件。 我想公开这个zip文件,以便它可以自动下载到用户的客户端。 下载后,我希望服务器检测下载完成并删除zip文件 1-如何在node js中公开文件?系统是否应将其放入公用文件夹?这意味着这将是一个安全风险,任何人都可以阅读。我如何链接到一个不在公用文件夹中的文件并使其可下载? 2-如何检测下载完成?我是否应该运行cron作业来删除文件,而不必担心下载进度?以下几点可以帮助您: 如果要创建临时文件,最

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

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

以下几点可以帮助您:

  • 如果要创建临时文件,最好创建签名的URL。这些URL包含在有限时间内有效的特定令牌。实现非常简单-生成文件.zip和令牌,最好在DB中设置时间戳,并使用令牌构造签名链接。如果客户端在给定的时间内未下载该文件,则该文件无效
  • Zip文件应该有唯一的名称,最好是一些随机名称(如果没有问题,您仍然可以使用名为
    Content-Disposition
    的标题在下载过程中决定其名称)。您可以将其存储在项目中的临时目录中
  • 在用户单击之前生成的带有与该文件相关的令牌的签名链接后,您开始下载(流式传输)。流传输完成后(请参阅NodeJS streams lib),您只需删除该文件
  • 在客户端:

  • 您创建了一个按钮,该按钮指向服务器上的端点(触发AJAX调用或其他调用)。单击后,在服务器上运行上述逻辑
  • 作为回报,用户客户端将获得生成的链接(指向另一个端点,该端点仅处理那些签名的链接),下载文件时必须遵循该链接
  • 使用任何类型的DOM操作,创建指向此链接的带有
    href
    的隐藏
    标记,然后在JS代码中触发自动单击此链接。如果您支持新的浏览器,最好在其中添加
    download
    属性
  • 不要:

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

  • 在服务器上创建两个端点(使用Express或任何用于路由的框架)。一个用于请求文件(启动生成过程),另一个用于下载
  • 生成过程完成后,将.zip存储在目录中,例如
    temp
    catalog,并为其创建令牌
  • 在数据库中为每次下载存储一组如下数据:
    • 压缩文件名
    • 令牌(例如,生成的随机散列)
    • 生成的时间戳
  • 将新链接传递给客户端(用于下载过程的第二个端点)。如上所述,客户端应自动初始化下载,无需人工交互
  • 当代码“单击”链接时,您的服务器在第二个端点上收到另一个请求,然后:
    • 检查令牌是否仍然有效(例如30秒)
    • 若否:403或404
    • 如果是:开始流式传输数据(创建文件流并将其流式传输到客户端)
    • 当流式返回时,使用
      内容配置
  • 流式处理完成后,删除该文件
  • 创建将运行的CRON作业,例如,每天运行一次,向DB询问所有具有无效令牌(过期令牌)的文件,并尝试删除这些文件(如果它们存在)(但如果在流式处理完成时正确删除它们,则这不应是常见情况)

  • 如何生成zip文件?您不能简单地用zip文件响应生成zip文件的请求。如果你这样做的话,保护zip文件并知道何时删除它会简单得多。我通过调用操作系统内置的zip命令行工具来生成zip文件。