8

我有由 iframe 中的重定向触发的下载。

  1. 用户点击“下载”按钮
  2. 我们的 JS 从服务器获取下载 URL(这是一个超时 URL,所以必须这样做)
  3. iframe 被重定向到具有附件内容配置的下载 url,因此浏览器在不更改页面位置的情况下开始下载。

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

我试图重现这个问题,这就是我想出的:

  • 如果快速单击“保存或打开”对话框,则下载始终有效
  • 如果“保存或打开”对话框的点击速度很慢(如 10-20 秒),则下载有时有效,有时无效。我一直找不到模式。

这是卡住时的样子:

在此处输入图像描述

问题不在于 S3 上的链接超时——我上面的实验完全在时间窗口内。

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

更新

服务器日志表明下载内容已完全发送给用户。

4

4 回答 4

6

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

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

时间问题

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

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

如果一个进程在 2 和 3 之间获取文件以进行独占读取怎么办?也许该应用程序对文件进行了一些更改,例如写入使 IE 感到困惑的备用 NTFS 流?

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

尝试在不运行任何防病毒软件(比将文件列入白名单更好的测试)且不加载任何浏览器插件的情况下重现问题。

HTTP问题

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

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

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

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

从您的屏幕截图来看,浏览器似乎无法计算预计到达时间,但它与下载之间没有关联。

于 2012-05-23T04:45:16.387 回答
4

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

PS:如果没有任何效果,试试这个

于 2012-05-16T15:58:48.053 回答
0

尝试设置cache-control: max-age为大于 0 的值。我注意到 IE 可能会像这样在设置为立即过期的内容上搞砸(即,通过使用无缓存)。

于 2012-05-23T04:55:18.130 回答
0

哪个版本的IE?如果您在下载完成之前没有决定如何处理下载,IE8 有时会出现异常行为......

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

而且您的屏幕截图实际上看起来像尚未进行选择时的下载对话框。后台某处是否有选择屏幕?

于 2012-05-22T16:54:35.790 回答