PHP:直接リンクを提供せずにファイルをダウンロード用に提供する


12

ダウンロード用の請求書を提供したい。現在、単純な番号付けスキーム(invoice-01.pdf、invoice-02.pdfなど)を使用しています。代わりにハッシュを使用してデータを不明瞭にすることができることを知っています。

PHPを使用して、ユーザーに直接ポイントさせないで請求書を提供することもできますか?


はい。「invoices.invalid /…」はどうですか?
mailq

回答:


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

彼らがURLを知っている場合、それは直接アクセスを避けます。それでも、readfile()を使用してPHPスクリプトから読み取ることができます。


1
あなたの提案のため、私は別のアイデアを思いつきました:私はすべての請求書をwwwフォルダーの外に置きました。:-) 再度、感謝します!
フランクVilea

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で他に何も送信しないように注意してください(エコーなし)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.