PHP: Sajikan file untuk diunduh tanpa memberikan tautan langsung

12

Saya ingin menayangkan faktur untuk diunduh. Saat ini saya menggunakan skema penomoran sederhana (faktur-01.pdf, faktur-02.pdf, dan sebagainya). Saya tahu bahwa saya bisa menggunakan hash untuk mengaburkan data.

Apakah mungkin menggunakan PHP dan menayangkan faktur dengan tidak langsung mengarahkan pengguna ke sana?

Frank Vilea
sumber
Iya. Bagaimana dengan " invoices.invalid / ... "?
mailq

Jawaban:

26

Bahkan ada contohnya di 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');
?> 

Atau perluas sedikit itu

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

Sam punya jawabannya. Juga meletakkannya di direktori dengan .htaccess:

Authname Private
AuthType basic
require user noadmittance

Itu akan mencegah akses langsung jika mereka mengetahui url. Anda masih dapat membacanya dari skrip PHP Anda dengan readfile ().

Charlie
sumber
1
Karena saran Anda, saya punya ide lain: Saya meletakkan semua faktur di luar folder www. :-) Terima kasih lagi!
Frank Vilea
1
Ya bahkan lebih baik!
Charlie
3

Saya temukan untuk panduan yang luar biasa ini: Cara melayani file besar melalui PHP .

Yang sangat berguna adalah trik lighttpd - Jika PHP Anda berjalan di bawah lighhtpd, skrip hanya perlu mengatur tajuk "X-Sendfile", dan lighttpd akan membaca dan mengirim file untuk Anda (dan ia juga tahu cara mengirim file).

MEMPERBARUI:

Lighttpd memiliki fitur ini dan ada mod_xsendfile untuk Apache2.

(Dikutip dari dokumentasi NginX )

Sandman4
sumber
0

Fungsi saya dengan deteksi tipe MIME otomatis:

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

penggunaan:

serve_file("/no_apache/invoice27342.pdf");

Perhatikan untuk tidak mengirim apa pun dengan PHP (tanpa gema).

Samuel Dauzon
sumber