0

そのため、アプリケーションの複数のインスタンスを実行しています。1つは2008、2009、2010 .. 2012です。これらすべてに、一連のデータの.XLSレポートをダウンロードできる機能があります。何らかの理由で、アプリケーションからダウンロードしたときにXLSファイルが破損しています。PDFをWebルートに移動してダウンロードすると、正常に開きますが、たとえば、Excelからダウンロードしようとするとdownload.php?file=29320f9je、ファイルの形式が認識されないと表示され、ゴミが吐き出されます(データ、ユニコードのゴミ箱に)

誰かが以前にこれに遭遇し、アプリケーションとヘッダー以外にチェックする他の提案がありますか?2010年から2012年までのコードは問題ないはずだからです。

使用例:

ユーザーがレポートを生成します。上記の方法で正しく表示できます。実際の方法は次のとおりです。

ユーザーが「ファイルのダウンロード」へのリンクをクリックします(report.retrieve.download.htm?file=2390jsf

report.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マーカーを閉じる(?>)を使用することを選択した人々は、これらのばかげたバグの1つになってしまいました。

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 に答える