PHP: servire un file per il download senza fornire il collegamento diretto


12

Voglio servire fatture per il download. Attualmente sto usando un semplice schema di numerazione (fattura-01.pdf, fattura-02.pdf e così via). So che potrei usare gli hash invece per oscurare i dati.

È anche possibile utilizzare PHP e servire le fatture non facendo in modo che l'utente le punti direttamente?


Sì. Che ne dici di " invoices.invalid / ... "?
mailq

Risposte:


26

C'è anche un esempio di questo su 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');
?> 

O espandi un po 'con

<?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 ha la risposta. Mettili anche in una directory con .htaccess:

Authname Private
AuthType basic
require user noadmittance

Ciò impedirà l'accesso diretto se conoscono l'URL. Puoi ancora leggerlo dal tuo script PHP con readfile ().


1
Grazie al tuo suggerimento, ho appena avuto un'altra idea: ho messo tutte le fatture al di fuori della cartella www. :-) Grazie ancora!
Frank Vilea,

1
Sì ancora meglio!
Charlie,

3

Ho trovato per questa eccellente guida: come servire file di grandi dimensioni tramite PHP .

Particolarmente utile è il trucco di lighttpd: se il tuo PHP funziona sotto lighhtpd, lo script deve solo impostare l'intestazione "X-Sendfile" e lighttpd leggerà e invierà il file per te (e sa bene come inviare i file).

AGGIORNARE:

Lighttpd ha questa funzione e c'è un file mod_xsend per Apache2.

(Citato dalla documentazione di NginX )


0

La mia funzione con rilevamento automatico del tipo 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);
}

utilizzo:

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

Fai attenzione a non inviare nient'altro con PHP (nessuna eco).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.