【问题标题】:Start a file download after redirecting a user to another page (NodeJS / Express)将用户重定向到另一个页面后开始文件下载(NodeJS / Express)
【发布时间】:2026-02-15 07:45:01
【问题描述】:

背景资料

  • 我正在开发一个带有 Express 项目的 NodeJS。
  • 有一些公开可见的按钮应该允许下载文件,并且这些按钮具有受保护的路由,如果用户未登录,这些路由会将用户重定向到登录页面。
  • 我正在将一些与文件下载相关的信息存储在一个 cookie 中,这是有效的。本质上是need_to_download_file2 == true

问题

一旦用户进行身份验证,我想将他们重定向到主页并然后开始为他们最初单击的文件下载文件。到目前为止,一切正常,但重定向后文件下载未开始,用户必须再次单击下载以启动它。

主要方法:

  • 我正在尝试在 index.html 页面的 onLoad() 事件中调用 window.open('/download/file2')。但是,网络选项卡将请求显示为已取消。这就是 onLoad() 事件中包含的全部内容。
// onLoad
function hidePreloader () {
  document.getElementById('preloader').style.display = 'none'
  document.getElementById('contentDiv').style.display = 'block'

  window.open('localhost:3000/download/file2','_self');
}

非常感谢任何帮助,如果需要可以提供更多信息!

提前致谢。

【问题讨论】:

  • 这是否被任何弹出窗口阻止程序阻止?
  • @LuttiCoelho 我不这么认为。我允许网站弹出窗口

标签: javascript node.js express download onload


【解决方案1】:

如果我没记错的话,所有客户端上传文件都必须由用户自己选择。不允许服务器指定要自行上传的文件(安全问题,因为服务器可能会随机定位您硬盘上的任何文件)。相反,用户必须手动选择要上传的文件。

您可以做的(为了更好的用户体验)检查用户是否在客户端通过 Javascript 进行了身份验证。如果没有,则使用 Ajax 将它们登录(不更改/丢失当前页面)。然后,在他们通过 Ajax 进行身份验证后,原始上传文件仍然在当前页面中指定,然后可以启动它,而无需用户再次选择文件。

当上传请求到达时,您的服务器仍会检查正确的身份验证,但如果用户遵循此路径,他们应该已经通过身份验证。

仅供参考,如果不是用户点击的直接结果,window.open() 通常会被浏览器中的弹出窗口阻止程序功能阻止(即使这样,有时仍然会出现问题)。不依赖弹出窗口会更可靠。通常,您可以使用页面中内置的弹出窗口来模拟相同的体验,而不是作为单独的窗口。

【讨论】:

  • 这是为了让客户端从我们的服务器下载文件,而不是上传。不知道会不会有影响
  • @ClicheCoffeeMug ​​- 我认为同样的概念也适用。使用Ajax登录,不会丢失当前网页的状态。
  • 明白了。我们目前正在使用 Auth0 来处理身份验证,并正在重定向到 auth0 提供的子域。这个实现不是永久的,所以当它改变时,我一定会调查这个。在此期间,我可能只是将链接隐藏在“经过身份验证的登录页面”后面,这样用户现在就不需要重新定向登录作为解决方法。
  • 嗯,这不是我想要的答案,但这是我暂时要使用的解决方法,所以我将其标记为已回答并将重新访问如果我决定公开显示链接但需要身份验证才能打开它们。再次感谢
  • 好吧,如果它只是页面中的复选框或类似的东西,您可以保留几种不同的方式,以便在身份验证重定向后再次选择它们。您必须决定使用哪种保存方法(通过重定向保留的 URL 中的此类查询参数,然后在重新呈现页面时在服务器端呈现中或在客户端中根据这些查询参数重新选中框页面加载时的JS)。
【解决方案2】:

添加触发器并触发它,这将调用相同的方法,由按钮调用。在 JQuery 中很容易实现,但在纯 javascript How to trigger event in JavaScript? 中可能会对您有所帮助。 在 node.js/express 中,您可以通过 npm i jquery 安装 jqyery 模块。

【讨论】:

  • 我会尽快调查并回复您,谢谢!
最近更新 更多