PHP: Sirva um arquivo para download sem fornecer o link direto

6

Eu quero atender faturas para download. Atualmente estou usando um esquema de numeração simples (invoice-01.pdf, invoice-02.pdf e assim por diante). Eu sei que eu poderia usar hashes para obscurecer os dados.

É também possível usar o PHP e servir as faturas por não ter o usuário diretamente apontado para elas?

    
por Frank Vilea 29.09.2011 / 15:13

3 respostas

19

Existe até um exemplo disso em 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');
?> 

Ou expanda um pouco com

<?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");
}
?>
    
por 29.09.2011 / 15:24
5

Sam tem a resposta. Coloque-os também em um diretório com .htaccess:

Authname Private
AuthType basic
require user noadmittance

Isso impedirá o acesso direto se eles souberem o URL. Você ainda pode lê-lo a partir do seu script PHP com readfile ().

    
por 29.09.2011 / 15:31
2

Eu encontrei este excelente guia: Como servir grandes arquivos através do PHP .

Especialmente útil é o truque lighttpd - Se seu PHP é executado sob o lighhtpd, o script só precisa configurar o cabeçalho "X-Sendfile", e o lighttpd irá ler e enviar o arquivo para você (e ele sabe como enviar arquivos ).

ATUALIZAÇÃO:

Lighttpd has this feature and there is a mod_xsendfile for Apache2.

(citado em documentação do NginX )

    
por 12.11.2013 / 02:11

Tags