そのため、アプリケーションの複数のインスタンスを実行しています。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;
}