Hầu hết các trình duyệt hiện đại cho phép tải xuống các tệp của một số loại nhất định tự động, mà không cần bất kỳ mã phía máy chủ nào như một tập lệnh PHP. Ví dụ, một tệp zip hoặc một tệp EXE.
Nếu một liên kết HTML trỏ đến tệp ZIP hoặc EXE, trình duyệt sẽ tải xuống và hiển thị hộp thoại lưu. Tuy nhiên, các tệp văn bản, tệp hình ảnh, v.v., sẽ không được tải xuống mà được mở trong trình duyệt, và bạn có thể lưu chúng vào hệ thống tệp cục bộ của mình.
Để tải xuống các tệp như vậy (thay vì trình duyệt tự động mở chúng), chúng ta có thể sử dụng hàm readfile() trong thư viện hàm tích hợp của PHP.
readfile(string $filename, bool $use_include_path = false, ?resource $context = null) : int|false
Hàm này đọc một tệp và ghi nó vào bộ đệm đầu ra.
Tham số thứ hai $use_include_path là false theo mặc định, do đó tệp trong thư mục hiện tại sẽ được tải xuống. Nếu được đặt thành true , các thư mục được thêm vào cài đặt include_path của cấu hình php.ini sẽ được tìm kiếm để xác định vị trí tệp cần tải xuống.
Hàm readfile() trả về số byte đã đọc hoặc false ngay cả khi nó hoàn thành thành công hay không.
Đoạn mã PHP sau đây cho thấy cách sử dụng hàm readfile().
Để tải một tệp, tiêu đề phản hồi Content-Type nên được đặt thành application/octect-stream . Loại MIME này là mặc định cho các tệp nhị phân. Các trình duyệt thường không thực thi nó, hoặc thậm chí hỏi xem nó có nên được thực thi hay không.
Ngoài ra, việc thiết lập tiêu đề Content-Disposition thành attachment sẽ khiến hộp thoại "Lưu thành" xuất hiện.
<?php $filePath = 'welcome.png'; // Set the Content-Type header to application/octet-stream header('Content-Type: application/octet-stream'); // Set the Content-Disposition header to the filename of the downloaded file header('Content-Disposition: attachment; filename="'. basename($filePath).'"'); // Read the contents of the file and output it to the browser. readfile($filePath); ?>
Lưu đoạn mã trên dưới dạng "download.php" trong thư mục gốc tài liệu. Đảm bảo rằng tệp cần tải xuống có mặt trong cùng một thư mục.
Bắt đầu máy chủ và truy cập http://localhost/download.php trong trình duyệt. Bạn sẽ nhận được một hộp thoại "Lưu dưới dạng" như bên dưới −
Bạn có thể chọn một tên và tải xuống tệp.
Đối với một tệp lớn, bạn có thể đọc nó từ luồng tệp theo từng khối với kích thước đã được định nghĩa trước. Trình duyệt sẽ đề nghị lưu nó vào hệ thống tệp cục bộ nếu tiêu đề Content-Disposition được thiết lập là "attachment", như trong ví dụ trước.
<?php $filename = 'welcome.png'; header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . basename($filename) . '"'); $handle = fopen($filename, 'rb'); $buffer = ''; $chunkSize = 1024 * 1024; ob_start(); while (!feof($handle)) { $buffer = fread($handle, $chunkSize); echo $buffer; ob_flush(); flush(); } fclose($handle); ?>