Mục lục
Tải lên tập tin (Upload file) bằng PHP
Trong bài hướng dẫn này, chúng ta sẽ học cách tải tập tin lên máy chủ từ xa bằng cách sử dụng biểu mẫu HTML đơn giản và PHP. Bạn có thể tải lên bất kỳ loại tập tin nào như hình ảnh, video, tập tin ZIP, tài liệu Microsoft Office, PDF, cũng như tập tin thực thi và nhiều loại tập tin khác nữa.
Bước 1: Tạo biểu mẫu HTML để tải tập tin lên
Ví dụ sau sẽ tạo một biểu mẫu HTML đơn giản có thể được sử dụng để tải tập tin lên.
Ví dụ
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8">
<title>Biểu mẫu Tải lên Tập Tin</title>
</head>
<body>
<form action="upload-manager.php" method="post" enctype="multipart/form-data">
<h2>Tải lên tập tin</h2>
<label for="fileSelect">Tên tập tin:</label>
<input type="file" name="photo" id="fileSelect">
<input type="submit" name="submit" value="Tải lên">
<p><strong>Chú ý:</strong>Chỉ những định dạng .jpg, .jpeg, .gif, .png với kích thước lớn nhất 5 MB được chấp nhận.</p>
</form>
</body>
</html>
Ghi chú: Ngoài trường chọn tập tin, biểu mẫu tải lên phải sử dụng phương thức HTTP post và phải chứa thuộc tính enctype="multipart/form-data". Thuộc tính này đảm bảo rằng dữ liệu biểu mẫu được mã hóa dưới dạng dữ liệu đa phần MIME - được yêu cầu để tải lên số lượng lớn dữ liệu nhị phân như hình ảnh, âm thanh, video,...
Bước 2: Xử lý tập tin đã tải lên
Đây là mã hoàn chỉnh của tập tin "upload-manager.php" của chúng ta. Nó sẽ lưu trữ tập tin đã tải lên trong thư mục "upload" trên cơ sở thường xuyên thực hiện một số kiểm tra bảo mật cơ bản trước đó như loại tập tin và kích thước tập tin để đảm bảo rằng người dùng tải lên đúng loại tập tin và trong giới hạn được cho phép.
Ví dụ
<?php
// Kiểm tra xem biểu mẫu đã được gửi chưa
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Kiểm tra xem tệp đã được tải lên mà không có lỗi hay không
if (isset($_FILES["photo"]) && $_FILES["photo"]["error"] == 0) {
$allowed = array("jpg" => "image/jpg", "jpeg" => "image/jpeg", "gif" => "image/gif", "png" => "image/png");
$filename = $_FILES["photo"]["name"];
$filetype = $_FILES["photo"]["type"];
$filesize = $_FILES["photo"]["size"];
// Xác minh phần mở rộng tệp
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if(!array_key_exists($ext, $allowed)) die("Lỗi: Vui lòng chọn định dạng tệp hợp lệ.");
// Xác minh kích thước tệp - tối đa 5MB
$maxsize = 5 * 1024 * 1024;
if ($filesize > $maxsize) die("Lỗi: Kích thước tệp lớn hơn giới hạn cho phép.");
// Xác minh loại MIME của tệp
if (in_array($filetype, $allowed)) {
// Kiểm tra xem tệp có tồn tại hay không trước khi tải lên
if (file_exists("upload/" . $filename)) {
echo $filename . " đã tồn tại.";
} else {
move_uploaded_file($_FILES["photo"]["tmp_name"], "upload/" . $filename);
echo "Tệp của bạn đã đăng tải thành công";
}
} else {
echo "Lỗi: Đã xảy ra sự cố khi tải tệp của bạn lên. Vui lòng thử lại.";
}
} else{
echo "Error: " . $_FILES["photo"]["error"];
}
}
?>
Ghi chú: Tập lệnh trên ngăn không cho tải lên tập tin có cùng tên với tập tin hiện có trong cùng một thư mục. Tuy nhiên, nếu như bạn muốn cho phép điều này, chỉ cần thêm trước tên tập tin với một chuỗi hoặc dấu thời gian ngẫu nhiên, như $filename = time() . '_' . $_FILES["photo"]["name"];
Có thể bạn sẽ thắc mắc code này có ý nghĩa như thế nào? Vâng, chúng ta hãy lần lượt xem qua từng phần của mã ví dụ này để hiểu rõ hơn về quy trình đó.
Giải thích mã
Sau khi biểu mẫu được gửi, thông tin về tập tin đã tải lên có thể được truy cập thông qua mảng superglobal trong PHP được gọi là $_FILES. Ví dụ: biểu mẫu tải lên của chúng tôi chứa trường chọn tập tin có tên là ảnh (tức là name="photo"), nếu bất kỳ người dùng nào đã tải tập tin lên bằng trường này, chúng ta có thể lấy thông tin chi tiết của nó như tên, loại, kích thước, tên tạm thời hoặc bất kỳ lỗi nào xảy ra khi cố tải lên thông qua mảng kết hợp $_FILES["photo"].
$_FILES["photo"]["name"]- Giá trị mảng này chỉ định tên gốc của tập tin, bao gồm cả phần mở rộng của tập tin. Nó không bao gồm đường dẫn tập tin.$_FILES["photo"]["type"]- Giá trị mảng này chỉ định kiểu MIME của tập tin.$_FILES["photo"]["size"]- Giá trị mảng này chỉ định kích thước tập tin, tính bằng byte.$_FILES["photo"]["tmp_name"]- Giá trị mảng này chỉ định tên tạm thời bao gồm đường dẫn đầy đủ được gán cho tập tin sau khi nó đã được tải lên máy chủ.$_FILES["photo"]["error"]- Giá trị mảng này chỉ định lỗi hoặc mã trạng thái liên quan đến việc tải lên tập tin, ví dụ: nó sẽ là 0, nếu không có lỗi.
Mã PHP trong ví dụ sau sẽ chỉ hiển thị thông tin chi tiết của tập tin đã tải lên và lưu trữ nó trong một thư mục tạm thời trên máy chủ của web.
Ví dụ
<?php
if ($_FILES["photo"]["error"] > 0) {
echo "Lỗi: " . $_FILES["photo"]["error"] . "<br>";
} else {
echo "Tên File: " . $_FILES["photo"]["name"] . "<br>";
echo "Loại File: " . $_FILES["photo"]["type"] . "<br>";
echo "Kích cỡ: " . ($_FILES["photo"]["size"] / 1024) . " KB<br>";
echo "Được lưu trữ tại: " . $_FILES["photo"]["tmp_name"];
}
?>
Mẹo: Khi tập tin đã được tải lên thành công, tập tin sẽ tự động được lưu trữ trong thư mục tạm thời trên máy chủ. Để lưu trữ tập tin này thường xuyên, bạn cần phải di chuyển tập tin từ thư mục tạm thời đến vị trí cố định bằng cách sử dụng hàm move_uploaded_file() trong PHP.







