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?


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

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 ().


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 )


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).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.