【发布时间】:2018-10-18 10:15:41
【问题描述】:
我有一个网站需要提供文件以供下载,然后导航到“谢谢”样式的页面。
到目前为止,我的方法是使用 window.location = "..." 两次 - 第一次让浏览器下载文件,然后再次将用户重定向到“thank you”页面。 p>
就像这个简化的例子:
function do_download(filename) {
window.location = "/files/" + filename;
setTimeout(function() {
window.location = "/files/thankyou";
}, 750);
}
在整个网站的开发和测试过程中,这对 Chrome 来说效果很好,但使用 Firefox、IE 或 Edge 时会出现问题 - 用户永远看不到文件下载,而只是被重定向到“谢谢 em>”页面。从服务器的角度来看,请求已发出并随后中止。
将 750 毫秒超时更改为 2.5 秒,这对于此类浏览器来说更加可靠,但现在我们似乎遇到了时间问题,我已经确认...
如果发出请求并开始收到响应的时间超过超时时间,则下载将被丢弃/中止,并且情况将“中断”(即:没有文件下载,刚刚重定向到“谢谢你”)。
我已通过在 JavaScript 中使用 2.5 秒延迟并在服务器中插入 3 秒延迟来确认这一点:
- 延迟“在发送响应标头之前”导致行为中断
- 延迟“在响应标头和文件的前几块发送后”,导致预期行为
这些观察结果似乎适用于所有浏览器 - 因此 Chrome 发出请求的速度可能更快,从而掩盖了最初的问题。
使用“大”超时是不合适的,因为如果服务器或网络繁忙,或者延迟很高,这种情况仍然会发生。
window.open() 不适合,因为 Chrome、Firefox 和 Edge 都阻止了“popup”,由于导航离开了原始页面,随后无法打开。
这引出了我的问题:
- 我应该如何提供文件以供下载并以更可靠的方式将用户重定向到“谢谢”页面?
【问题讨论】:
-
1.下载按钮是具有
target="_blank"的链接。这将打开一个新选项卡,但如果服务器发送文件,该选项卡应立即再次关闭。 2.点击也触发“谢谢” -
你能把下载推送到“谢谢”页面吗?创建一个包含文件路径的字符串
onclick,并将其发送到显示“谢谢”的下一页,然后就可以开始下载了。 -
@ChrisG 感谢您的建议 - 不幸的是,下载需要由 javascript 启动(必须执行一个过程来验证下载)
-
@SimonJensen 我想我现在已经找到了一个可行的解决方案,但我会记住这一点,谢谢
-
@SimonJensen - 可能值得将其发布为答案。 很多网站似乎就是这样做的。
标签: javascript http download