Hàm readfile() trong PHP
Trần Thị Vân
- 1242
- 11/08/2025
Chức năng của Hàm readfile() trong PHP
Hàm readfile() trong PHP dùng để đọc nội dung của file, lấy số ký tự của file, hoặc dùng để tải file.
Cú pháp của Hàm readfile() trong PHP
readfile("đường_dẫn_đến_file");
đường_dẫn_đến_file: Đường dẫn đến file.
Code Hàm readfile() trong PHP
Nội dung trong file:
<p>Hàm readfile() trong PHP dòng 1</p>
<p>Hàm readfile() trong PHP dòng 2</p>
<p>Hàm readfile() trong PHP dòng 3</p>
<p>Hàm readfile() trong PHP dòng 4</p>
<p>Hàm readfile() trong PHP dòng cuối</p>
Code Hàm readfile() trong PHP đọc nội dung file
<?php
$filenguon = "thumuctest/test.txt";
readfile($filenguon)."<br>";
?>
Kết quả:
Hàm readfile() trong PHP dòng 1
Hàm readfile() trong PHP dòng 2
Hàm readfile() trong PHP dòng 3
Hàm readfile() trong PHP dòng 4
Hàm readfile() trong PHP dòng cuối
Code Hàm readfile() trong PHP đọc nội dung file và số ký tự
<?php
$filenguon = "thumuctest/test.txt";
echo readfile($filenguon)."<br>";
?>
Kết quả:
Hàm readfile() trong PHP dòng 1
Hàm readfile() trong PHP dòng 2
Hàm readfile() trong PHP dòng 3
Hàm readfile() trong PHP dòng 4
Hàm readfile() trong PHP dòng cuối
209
Code Hàm readfile() trong PHP dùng để tải file
<?php
$filenguon = "thumuctest/test.txt";
if (file_exists($filenguon)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($filenguon));
readfile($filenguon);
exit;
}
?>
Kết quả trong nội dung file được tải:
<p>Hàm readfile() trong PHP dòng 1</p>
<p>Hàm readfile() trong PHP dòng 2</p>
<p>Hàm readfile() trong PHP dòng 3</p>
<p>Hàm readfile() trong PHP dòng 4</p>
<p>Hàm readfile() trong PHP dòng cuối</p>
Ứng dụng hàm readfile() trong PHP vào thực tế
Đọc và hiển thị nội dung file bằng readfile()
Khi cần đưa toàn bộ nội dung của một file ra trình duyệt, readfile() có thể thực hiện trực tiếp mà không cần tự mở file, đọc dữ liệu rồi đóng file. Hàm sẽ đọc file được chỉ định và gửi dữ liệu ra output, đồng thời trả về số byte đã đọc nếu thao tác thành công.
Cách này phù hợp với những file có nội dung đơn giản và cần xuất trực tiếp. Ví dụ, PHP có thể đọc một file văn bản như sau:
<?php
readfile("thong-bao.txt");
?>
Nếu thong-bao.txt tồn tại và PHP có quyền đọc, nội dung bên trong file sẽ được xuất tại vị trí thực thi hàm. Với cách sử dụng này, không cần dùng thêm file_get_contents() chỉ để lấy dữ liệu rồi xuất ra màn hình.
Tuy nhiên, readfile() không phải lựa chọn tối ưu khi cần xử lý hoặc biến đổi nội dung trước khi hiển thị. Nếu cần kiểm tra, thay thế chuỗi, lọc dữ liệu hoặc thao tác với nội dung trước khi xuất, nên đọc dữ liệu vào biến bằng phương pháp phù hợp rồi xử lý riêng.
Sử dụng readfile() để tải file cho người dùng
Một ứng dụng phổ biến hơn của readfile() là tạo chức năng tải xuống. PHP có thể thiết lập header HTTP để trình duyệt hiểu rằng dữ liệu đang được trả về là một file cần tải thay vì hiển thị trực tiếp.
Ví dụ, một file PDF có thể được cung cấp cho người dùng thông qua PHP:
<?php
$file = "tai-lieu.pdf";
if (file_exists($file)) {
header("Content-Type: application/pdf");
header("Content-Disposition: attachment; filename=\"tai-lieu.pdf\"");
header("Content-Length: " . filesize($file));
readfile($file);
exit;
}
?>
Trong trường hợp này, readfile() đảm nhiệm việc đưa dữ liệu của file vào response. Các header phía trước giúp trình duyệt xác định loại dữ liệu, tên file và kích thước file.
Trước khi đọc file, nên kiểm tra file có thực sự tồn tại và có thể truy cập hay không. Với hệ thống cho phép người dùng chỉ định tên file, cần đặc biệt kiểm soát đường dẫn để tránh việc họ truy cập trái phép vào những file nằm ngoài phạm vi được phép tải.
Kết hợp readfile() với header() khi tải file
readfile() chỉ đảm nhiệm việc đọc và xuất dữ liệu. Để xây dựng một chức năng tải file hoàn chỉnh, header() thường được sử dụng trước đó để gửi thông tin cần thiết cho trình duyệt.
Một số header thường gặp gồm:
- Content-Type: xác định kiểu dữ liệu của file.
- Content-Disposition: chỉ định cách trình duyệt xử lý file, chẳng hạn tải xuống với tên cụ thể.
- Content-Length: cung cấp kích thước dữ liệu được trả về.
Ví dụ với file ZIP:
<?php
$file = "du-lieu.zip";
if (is_file($file) && is_readable($file)) {
header("Content-Type: application/zip");
header("Content-Disposition: attachment; filename=\"du-lieu.zip\"");
header("Content-Length: " . filesize($file));
readfile($file);
exit;
}
?>
Điểm quan trọng là không nên xuất thêm nội dung trước khi gửi các header. Một khoảng trắng, thông báo lỗi hoặc HTML được gửi trước cũng có thể khiến response không còn hoạt động như mong muốn.
Những vấn đề cần lưu ý khi dùng readfile() để tải file
Khi dùng readfile() trong chức năng tải xuống, vấn đề quan trọng nhất không nằm ở cú pháp mà ở việc kiểm soát file và response. Đường dẫn do người dùng cung cấp không nên được đưa thẳng vào hàm mà chưa qua kiểm tra.
Nên giới hạn file được phép tải theo danh sách hoặc thư mục được xác định trước. Đồng thời, có thể kiểm tra bằng is_file() và is_readable() trước khi thực hiện việc đọc.
Nếu file không tồn tại, không có quyền đọc hoặc đường dẫn không hợp lệ, cần xử lý trường hợp lỗi thay vì tiếp tục gọi readfile(). Sau khi dữ liệu đã được xuất, dùng exit giúp tránh việc PHP tiếp tục tạo thêm nội dung không thuộc về file đang tải.
Với file lớn, cũng cần cân nhắc cách phân phối dữ liệu và giới hạn tài nguyên của máy chủ. readfile() có ưu điểm là phù hợp với việc xuất trực tiếp dữ liệu file, nhưng chức năng tải xuống thực tế vẫn cần được thiết kế cùng với cơ chế phân quyền, kiểm tra đường dẫn và xử lý lỗi để tránh biến một endpoint tải file thành điểm truy cập trái phép.
Lời kết
Cảm ơn các bạn đã tham khảo bài viết Hàm readfile() trong PHP.
- 0 Bình luận
Email, Điện thoại của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *