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

我失去了这一个.我已经看完了,似乎有很多的解决方案,但他们不为我工作.我有一个CGI ::应用程序应用程序生成一个MS Excel电子表格与Spreadsheet :: WriteExcel.这可以在一段时间内运行正常,直到几周前我们的实时服务器出现硬件故障.我们使用中断作为借口升级Windows Server 2008(从2003年)和Apache 2.2.17(从2.2.11).现在,在尝试下载电子表格时,我收到客户收到的错误消息(但是太频繁地忽略了):

Internet Explorer cannot download [url] from [site].
Internet Explorer was not able to open this Internet site. The requested site is either unavailable or cannot be found. Please try again later.

我在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中的错误工作? (在这种情况下,服务器升级将是一个不幸的巧合.)

解决方法

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

我会删除标题并给它一个文件名,IE应该能够将文件保存到磁盘,以便它可以被Excel打开.

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...