PHP : 직접 링크를 제공하지 않고 다운로드 할 파일 제공


12

다운로드 송장을 제공하고 싶습니다. 현재 간단한 번호 매기기 체계 (invoice-01.pdf, invoice-02.pdf 등)를 사용하고 있습니다. 데이터를 가리기 위해 해시를 대신 사용할 수 있다는 것을 알고 있습니다.

또한 사용자가 직접 PHP를 사용하지 않도록하여 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 폴더 외부에 넣었습니다. :-) 다시 감사합니다!
Frank Vilea

1
그래, 더 좋아!
Charlie

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.