0

因此,我运行了一个应用程序的多个实例,一个用于 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;
    }
4

1 回答 1

0

一个不同的文件有一个尾随换行符;一个是包含的包含的包含的。我没有编写此应用程序,但确实选择使用关闭 PHP 标记 (?>) 的人最终遇到了这些愚蠢的错误之一。

zipp@zeratul htdocs]# echo '<?php foreach (glob("*.php") as $file){if (preg_match( "/\\?".">\\s\\s+\\Z/m", file_get_contents($file))) echo("$file\n");} ?>' | php
config.class.php
于 2012-10-25T22:15:07.560 回答