0

我遇到了一个与在 Internet Explorer 中下载文件有关的尴尬问题。服务器环境如下:

  • Apache2 作为带有 mod_jk 的 Web 服务器
  • Tomcat6作为应用服务器
  • Java/Spring 应用程序

这些文件由 Java Servlet 提供。当同时使用 Internet Explorer 从 2 个客户端请求某个文件时,会出现此问题。其中一个客户端无法获取整个文件,最终导致下载损坏。

我使用 Wireshark 查看入站数据。并且下载停止在 90k 文件中的 50k 处,来自服务器的 RELOAD(资源定位和发现框架)请求。

这只发生在 Internet Explorer 中。多次使用 Chrome/Firefox 尝试相同的场景。每次下载成功完成时,文件都可以正常工作。

我已经检查了应用程序和 Apache 日志。与此问题无关。通过调试级别的 mod_jk 日志。它记录了仅发送了 50k 的文件。但是在任何地方都没有记录任何错误。

下载 servlet 也是线程安全的,doPost() 方法中不使用类变量。

那么如何修复或追查这个问题的根源呢?

谢谢。

4

3 回答 3

2

没有足够的信息来诊断问题,但我可以建议使用 Internet Explorer 和(例如)Firefox 仔细检查请求标头和资源标头(Content-LengthContent-Type,以及任何“深奥”的标头)。

前段时间我遇到了资源供应代码错误的问题,它发出了不正确的内容长度。不知何故,这在 Firefox 和 Chrome 中有效,但导致 Internet Explorer 出错。你的问题可能类似。

两个(据我所知不同)客户端导致问题的事实使我认为问题出在服务器端;只有资源管理器传输的某些标头遇到了您忽略的一些错误。了解标头可能有助于定位错误,或者至少提供有关如何解决它的提示。

我意识到(并同意)如果下载 servlet 是“真正的”线程安全的,那么它不可能是服务器问题,但另一方面,服务器下载链是否真正线程安全且不变,第二个怎么可能? IE 客户端“知道”它实际上是第二个客户端?

于 2012-12-25T20:36:44.703 回答
1

通常通过在下载脚本中提供正确的 MIME 类型来解决此问题。

但是,如果这些 pdf 文件是从直接位置下载的,那么问题就出在第三方软件上。

禁用防病毒/反恶意软件/防火墙软件和 IE 插件,看看是否会导致问题。

于 2012-12-24T15:37:15.213 回答
0

问题实际上是超时问题。apache2 conf 文件中的TIMEOUT参数设置为5而不是300

当您使用 IE 请求文件时,浏览器会询问您是要下载文件还是直接打开文件。如果您在该选择屏幕上等待超过TIMEOUT (5) 秒,当我尝试同步单击 2 台计算机的链接时发生这种情况,服务器仅发送文件的一部分并停止导致文件损坏. 但在 FF/Chrome 中,浏览器在后台以类似的选择屏幕开始下载,而无需等待您的决定。

我显然完全错误地诊断了这个问题。但是我遵循了向我报告的内容,在尝试复制它时,错误发生了很多次,因为显然我在那些屏幕上等待了超过 5 秒。

于 2012-12-26T22:26:41.137 回答