因此,我运行了一个应用程序的多个实例,一个用于 2008、2009、2010.. 2012 年。所有这些都有一个功能,您可以下载一组数据的 .XLS 报告。由于某种原因,XLS 文件在通过应用程序下载时被破坏。您可以将 pdf 移动到 webroot,下载它,它会很好地打开,但是当您尝试通过 下载它时download.php?file=29320f9je
,Excel 说它无法识别文件的格式,并吐出垃圾(应该是我们的数据,只是在 unicode 垃圾中)
除了应用程序和标头之外,任何人都遇到过这个问题并有其他建议要检查吗?因为 2010 和 2012 之间的代码应该没问题。
使用示例:
用户生成报告。可以通过以上方法正常查看。实际方法如下:
用户点击“下载文件”链接 ( report.retrieve.download.htm?file=2390jsf
)
报告.retrieve.download.htm
$file = $_GET['file'];
$tempfile = new tempfile(''); // open tempfile class, argument is name of report
if ($tempfile->set_filename($file) === false)
$tempfile->error_report('4026','',"Filename: $file",'Y');
if ($tempfile->send_file() === false)
$tempfile->error_report('4027','',"Filename: $file",'Y');
关联功能
public function send_file() {
$file = $this->get_full_filename();
if (file_exists($file)===FALSE)
return FALSE;
if ($this->send_headers($file)===FALSE)
return FALSE;
$this->output_file($file);
return TRUE;
}
并且所有重要的标题功能..
public function send_headers($filename) {
if (headers_sent()===TRUE)
return FALSE;
if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/MSIE/", $_SERVER['HTTP_USER_AGENT'])) {
// IE Bug in download name workaround
ini_set( 'zlib.output_compression','Off' );
}
/*
$fInfo = new finfo(FILEINFO_MIME);
$type = $fInfo->file($filename);
$stats = stat($filename);
$size = $stats['size'];
*/
$output_filename = $this->get_output_filename();
if (eregi('csv$', $this->get_output_filename())) {
header("Content-type: text/csv");
//header("Content-Size: $size");
header("Pragma: public");
header("Content-Disposition: attachment; filename=$output_filename");
}
elseif (eregi('htm$', $this->get_output_filename()))
header("Content-type: text/html");
else {
header("Content-type: application/vnd.ms-excel");
//header("Content-Size: $size");
header("Pragma: public");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Disposition: attachment; filename=$output_filename");
}
return TRUE;
}