文件下载结果“IE无法打开此网站”

时间:2011-05-31 23:39:05

标签: perl apache internet-explorer mod-perl

我对这个感到茫然。我看了很多,似乎有很多解决方案,但它们并不适合我。我有一个CGI :: Application应用程序生成一个带有Spreadsheet :: WriteExcel的MS Excel电子表格。这个工作正常一段时间,直到我们的实时服务器在几周前出现硬件故障。我们使用中断作为升级到Windows Server 2008(从2003年)和Apache 2.2.17(从2.2.11)升级的借口。现在,我在尝试下载电子表格时收到此错误的客户提出了零星的(但是经常被忽视)投诉:

  

Internet Explorer无法从[site]下载[url]   Internet Explorer无法打开此Internet站点。请求的网站不可用或无法找到。请稍后再试。

我在XP,Vista和7上尝试过IE 7-8,并且无法在本地重现此错误。有问题的用户每次都有,而不是随机。所有投诉都来自IE用户,主要是IE8。

在阅读了几条关于错误消息的帖子后,我添加了-expires标题无济于事。 (无法直接测试,我必须实施修复并等待一天左右,以确定人们是否停止抱怨._.

sub export_spreadsheet {
   my $self = shift;
   binmode STDOUT;

   my $str;
   open my $fh, '>', \$str;
   my $workbook = Spreadsheet::WriteExcel->new($fh);
   # words words words
   $workbook->close;
   close $fh;

   $self->header_add(-type => 'application/vnd.ms-excel',
                     -expires => '+1d',
                     -attachment => 'export.xls');
   return $str;
}  

请求的标头看起来很正常。这些都是在我的本地机器上收集的,请注意。

HTTP/1.1 200 OK
Date: Tue, 31 May 2011 22:23:17 GMT
Server: Apache/2.2.17 (Win32) mod_ssl/2.2.17 OpenSSL/0.9.8o mod_perl/2.0.4-dev Perl/v5.10.1
Expires: Wed, 01 Jun 2011 22:23:18 GMT
Content-Disposition: attachment; filename="export.xls"
Vary: Accept-Encoding
Keep-Alive: timeout=5, max=100
Content-Type: application/vnd.ms-excel
Content-Length: 18944
Accept-Ranges: none
Proxy-Connection: Keep-Alive

我们为客户提供的当前解决方法(无法或不愿意切换到备用浏览器)是通过自己键入https来切换到SSL。 SSL下载适用于已经尝试过并回到我们这里的人。推测:它可能是一个下游代理搞乱我们的标题?这可能是它在SSL和普通HTTP中的错误中工作的原因吗? (在这种情况下,服务器升级将是一个不幸的巧合。)

3 个答案:

答案 0 :(得分:8)

根据http://support.microsoft.com/kb/316431,IE无法处理文件未缓存但某些外部进程打开的情况。这不是完全相同的情况,但正如EricLaw在评论中提到的,它可能与Vary标题有关,并且下载没有文件名这一事实。

我将删除该标题并为其指定文件名,IE应该能够将文件保存到磁盘,以便Excel可以打开它。

答案 1 :(得分:2)

如果整个系统正在运行并且只有下载偶尔会失败,那么您也可以尝试为文件名提供动态名称。

答案 2 :(得分:1)

我们最近有一个类似的案例,在MS网站上查看whole bunch of useless answers后,我发现了一个有趣的{ {3}}更多地阐明了这个问题,主要是关于阻止缓存的标题(包括最终解决OP问题的Vary标题,+ 1。)。

但是,IE也会在其他一些情况下抛出这种误导性的异常,所以我想我会在这里添加它,以防它对遇到同样问题的其他人有用。在我们的例子中,事实证明,生成(Excel)文件并将其发送到响应的JSP的作者忘记确保没有空格应该在响应中的文件内容之前。

对于Java / JSP文件(我确信您可以将相同的原则适用于其他语言),当您看到无辜的东西时会出现问题:

<%@ page contentType="text/html; charset="iso-8859-1" pageEncoding="iso-8859-1" errorPage="" language="java" session="true" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
[and so on]

即。在生成文件内容并将它们发送到响应之前,将回车作为JSP指令的一部分而不是之间的,因为这些行之间的回车是空白,它设法抛出一个虚拟扳手在IE的精致机械(普通浏览器似乎处理这个很好)。如果你改为像这样格式化代码:

<%@ page contentType="text/html; charset="iso-8859-1" pageEncoding="iso-8859-1" errorPage="" language="java" session="true"
%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"
%>[and so on]
那时你应该没问题。我敢肯定大多数网络开发者都遇到过类似的问题,但在我的情况下,它已经有一段时间了,我必须先看几遍JSP,然后再注意到一行没有这样做....