为什么我的用户的下载在IE中随机停止?

我有一个由iframe中的redirect触发的下载。

  1. 用户点击“下载”button
  2. 我们的JS从服务器获取下载URL(这是一个超时的URL,所以必须这样做)
  3. iframe被redirect到具有附件内容configuration的下载url,所以浏览器开始下载而不改变页面的位置。

这适用于所有用户和浏览器…除了一些IE用户。

我试图重现这个问题,下面是我想到的:

  • 如果快速点击“保存或打开”对话框,则下载始终有效
  • 如果点击“保存或打开”对话框(如10-20秒),下载有时会起作用,有时不起作用。 我一直没能find一个模式。

以下是卡住时的样子:

在这里输入图像说明

这个问题不是S3上的链接超时问题 – 我上面的实验完全在时间窗口内。

什么可能导致这些零星的下载失败?

更新

服务器日志build议下载完全发送给用户。

我做了一些测试,下载LLVM测试套件 ,一个78兆字节的文件,在Windows 7中使用IE 9。下载从您点击链接开始。 Internet Explorer不会等待您确认或取消。 IE将字节保存到名为fizzbuz的文件中的下载目录中。 部分 。 IE会赶上你的选择通过重命名文件,当它完成或删除它,如果你取消。

这可能是计时问题或HTTP问题。

定时问题

有可能是另一个进程打开文件,甚至可能锁定它? 也许是一个过分热心的反病毒或实时备份软件? 机会是关闭和重命名操作(必须发生,因为服务器发送整个文件)是这样的:

  1. 将最后的有效字节写入fizzbuzz。 部分文件
  2. 关闭文件
  3. 重命名文件

如果一个进程抓取2到3之间的独占读取文件呢? 也许这个应用程序会对文件进行一些修改,比如写一个替代IE的NTFS流?

请记住,浏览器插件也会通知下载结束。 另一种计时问题可能是由监视下载的插件引起的,看到它结束,做一些操作。 这种手术在某些情况下可能会失败或永远不会返回。

尝试重现这个问题,不要运行任何反病毒(一个更好的测试,而不仅仅是白名单文件),并没有任何浏览器插件加载。

HTTP问题

服务器和客户端必须就如何结束连接达成一致。 您必须:

  1. 在传输结束时关闭连接
  2. 指定下载的长度

很难从远处进行调试,但如果可能的话,捕获下载的网络跟踪并寻找这些线索:

  1. 内容长度标题不存在或可能偏离N(浏览器将永远等待N字节不会来)?
  2. 每个客户端是否具有相同的代理配置?
  3. 非工作客户端是否降级到HTTP 1.0? (有一个名为“始终使用http 1.0通过代理”

在屏幕截图中,浏览器无法计算预计到达时间,但与下载无关。

我不知道IE如何处理它,但是在其他浏览器中,当你选择你要存储文件的位置时,下载已经开始了。 什么是您的下载网址的超时时间? 你有没有试过把它设置得更高? 它不止一次地工作? (如果没有,请检查您的日志失败的访问尝试)。 祝你好运。

PS:如果没有什么工作, 试试这个 。

哪个版本的IE? 如果您在下载完成之前不确定如何处理下载,则IE8有时会出现故障…

如果服务器记录数据发送到客户端/浏览器比接下来要调查的是代理和浏览器。

而您的屏幕截图实际上看起来像下载对话框,而尚未选择。 有没有选择屏幕的背景?

尝试将cache-control: max-age设置为大于0的值。我注意到,IE可以像这样设置为立即过期的内容(即,通过使用no-cache)搞砸了。