Answers:
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");
}
?>
山姆有答案。还要将它们放在带有.htaccess的目录中:
Authname Private
AuthType basic
require user noadmittance
如果他们知道网址,那将阻止直接访问。您仍然可以使用readfile()从PHP脚本中读取它。
我找到了这份出色的指南:如何通过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发送其他任何东西(无回声)。