アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHP初学者です、よろしくお願い致します。
PHPでバックアップを取りたく、次の様にしてみたのですが、実行するとファイルは正しいサイズでダウンロードされるのですが解凍すると中身は空になっています。できたファイルをFTPで別途ダウンロードして解凍してみると正常です。
$file = $storedir.$generatefile;
$tstr = 'tar -C '.$upperdir. ' -czf '.$storedir.$generatefile.' '.$targetfolder;
$result = system($tstr, $retval);

if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
}

ファイルが出来上がっていないのにダウンロードが始まってしまうからでしょうか?もしそうならファイルが出来上がってからダウンロードが始まるようにするにはどうしたら良いでしょうか?
根本的にやり方が良くないようでしたらそれもご指摘いただければありがたいです。よろしくお願いいたします。

A 回答 (1件)

なぜ



>ob_clean();
>flush();

しているの?

それとreadfileはバイナリセーフではないのでは?

この回答への補足

コメントありがとうございます。
http://php.benscom.com/manual/ja/function.readfi …
からコピーした物で、これが問題を起こしているのでしょうか?
readfile以外に方法がありますでしょうか?(調べてみます。)

補足日時:2009/05/19 20:20
    • good
    • 0
この回答へのお礼

Zend FrameWorkでsmartyを使用していたため、ダウンロードされるファイルの頭にページ情報がくっついていました。次の様にして正しいファイルを得られました。お騒がせいたしました。
$file = $storedir.$generatefile;
$tstr = 'tar -C '.$upperdir. ' -czf '.$storedir.$generatefile.' '.$targetfolder;
$result = system($tstr, $retval);

if (file_exists($file)) {
$response = $this->getResponse();
$response->setRawHeader('Content-Description: File Transfer');
$response->setRawHeader('Content-Type: application/octet-stream');
$response->setRawHeader('Content-Disposition: attachment; filename='.basename($file));
$response->setRawHeader('Content-Transfer-Encoding: binary');
$response->setRawHeader('Expires: 0');
$response->setRawHeader('Cache-Control: must-revalidate, post-check=0, pre-check=0');
$response->setRawHeader('Pragma: public');
$response->setRawHeader('Content-Length: ' . filesize($file));
$response->setBody(file_get_contents($file));
$response->sendResponse();
}

お礼日時:2009/05/20 05:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!