PHP:提供文件供下载,但不提供直接链接


12

我想提供发票下载。目前,我正在使用一种简单的编号方案(invoice-01.pdf,invoice-02.pdf等)。我知道我可以使用哈希代替来遮盖数据。

是否可以通过不直接让用户指向发票来使用PHP来提供发票?


是。“ invoices.invalid / ... ”怎么样?
mailq

Answers:


26

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");
}
?>

5

山姆有答案。还要将它们放在带有.htaccess的目录中:

Authname Private
AuthType basic
require user noadmittance

如果他们知道网址,那将阻止直接访问。您仍然可以使用readfile()从PHP脚本中读取它。


1
由于您的建议,我想到了另一个主意:我将所有发票放在www文件夹之外。:-) 再次感谢!
Frank Vilea 2011年

1
是的,更好!
查理

3

我找到了这份出色的指南:如何通过PHP服务大文件

lighttpd技巧特别有用-如果您的PHP恰巧在lighhtpd下运行,脚本只需设置“ X-Sendfile”标头,lighttpd就会为您读取和发送文件(并且它知道如何发送文件)。

更新:

Lighttpd具有此功能,并且Apache2有一个mod_xsendfile。

(引自NginX文档


0

我的自动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发送其他任何东西(无回声)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.