PHP: Phục vụ một tệp để tải xuống mà không cung cấp liên kết trực tiếp


12

Tôi muốn phục vụ hóa đơn để tải về. Hiện tại tôi đang sử dụng sơ đồ đánh số đơn giản (hóa đơn-01.pdf, hóa đơn-02.pdf, v.v.). Tôi biết rằng tôi có thể sử dụng băm thay vì che khuất dữ liệu.

Có phải cũng có thể sử dụng PHP và phục vụ các hóa đơn bằng cách không trực tiếp khiến người dùng trỏ đến chúng?


Đúng. Làm thế nào về " hóa đơn.invalid / khắc "?
mailq

Câu trả lời:


26

Thậm chí còn có một ví dụ về điều này trên 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');
?> 

Hoặc mở rộng một chút với

<?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 có câu trả lời. Đồng thời đặt chúng trong một thư mục có .htaccess:

Authname Private
AuthType basic
require user noadmittance

Điều đó sẽ tiếp tục truy cập trực tiếp nếu họ biết url. Bạn vẫn có thể đọc nó từ tập lệnh PHP của bạn với readfile ().


1
Vì đề nghị của bạn, tôi chỉ có một ý tưởng khác: Tôi đặt tất cả các hóa đơn bên ngoài thư mục www. :-) Cảm ơn một lần nữa!
Frank Vilea

1
Vâng thậm chí còn tốt hơn!
Charlie

3

Tôi tìm thấy hướng dẫn tuyệt vời này: Cách phục vụ các tệp lớn thông qua PHP .

Đặc biệt hữu ích là thủ thuật lighttpd - Nếu PHP của bạn tình cờ chạy dưới lighhtpd, tập lệnh chỉ cần đặt tiêu đề "X-Sendfile", và lighttpd sẽ đọc và gửi tệp cho bạn (và nó cũng biết cách gửi tệp).

CẬP NHẬT:

Lighttpd có tính năng này và có mod_xsendfile cho Apache2.

(Trích dẫn từ tài liệu NginX )


0

Chức năng của tôi với phát hiện loại MIME tự động:

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

sử dụng :

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

Chú ý không gửi bất cứ thứ gì khác với PHP (không có tiếng vang).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.