回答:
php.netにこの例さえあります
<?php
// We'll be outputting a PDF
header('Content-type: application/pdf');
// It will be called downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');
// The PDF source is in original.pdf
readfile('original.pdf');
?>
またはそれを少し拡張する
<?php
if ( can_this_file_be_downloaded() ) {
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="invoice.pdf"');
readfile("{$_GET['filename']}.pdf");
} else {
die("None shall pass");
}
?>
この優れたガイド:PHPを介して大きなファイルを提供する方法を見つけました。
特に便利なのはlighttpdトリックです。PHPがlighhtpdで実行された場合、スクリプトは "X-Sendfile"ヘッダーを設定するだけでよく、lighttpdがファイルを読み取って送信します(ファイルの送信方法もよくわかっています)。
更新:
Lighttpdにはこの機能があり、Apache2用のmod_xsendfileがあります。
(NginXのドキュメントから引用)
自動MIMEタイプ検出を使用する私の機能:
function serve_file($filepath, $new_filename=null) {
$filename = basename($filepath);
if (!$new_filename) {
$new_filename = $filename;
}
$mime_type = mime_content_type($filepath);
header('Content-type: '.$mime_type);
header('Content-Disposition: attachment; filename="downloaded.pdf"');
readfile($filepath);
}
使用法 :
serve_file("/no_apache/invoice27342.pdf");
PHPで他に何も送信しないように注意してください(エコーなし)。