Giới thiệu
Trong lập trình web, upload file là một tính năng quan trọng và phổ biến, cho phép người dùng tải tệp tin từ máy tính cá nhân lên máy chủ thông qua giao diện web. PHP cung cấp các công cụ mạnh mẽ để xử lý việc upload file, giúp lập trình viên dễ dàng thực hiện việc này trong ứng dụng của mình.
Trong bài viết này, chúng ta sẽ tìm hiểu cách upload file trong PHP từ cơ bản đến nâng cao, cùng với các ví dụ cụ thể để bạn dễ dàng áp dụng.
1. Cách hoạt động của việc upload file trong PHP
Khi người dùng chọn file và nhấn nút tải lên, file sẽ được gửi đến máy chủ. PHP xử lý file này và lưu nó vào một thư mục cụ thể trên máy chủ. Dữ liệu của file tải lên được lưu trữ trong một mảng toàn cục $_FILES.
Dưới đây là quy trình cơ bản của việc upload file:
- Người dùng chọn file từ form HTML.
- File được gửi đến máy chủ khi form được submit.
- PHP nhận file và lưu trữ vào thư mục tạm thời.
- PHP di chuyển file từ thư mục tạm thời sang thư mục đích bạn chỉ định.
2. Cấu trúc form HTML để upload file
Để cho phép người dùng tải lên file, chúng ta cần một form HTML với thuộc tính enctype="multipart/form-data", cho phép gửi dữ liệu file qua POST.
Ví dụ 1: Form upload file
<form action="upload.php" method="post" enctype="multipart/form-data">
<label for="fileToUpload">Chọn file để tải lên:</label>
<input type="file" name="fileToUpload" id="fileToUpload">
<button type="submit">Tải lên</button>
</form>Giải thích:
enctype="multipart/form-data": Giúp form xử lý dữ liệu file.input type="file": Cho phép người dùng chọn file từ máy tính cá nhân.
3. Xử lý file tải lên trong PHP
Sau khi form được submit, chúng ta cần xử lý file này bằng cách kiểm tra, xác thực và di chuyển file vào thư mục đích.
Ví dụ 2: Xử lý việc upload file trong PHP (upload.php)
<?php
$target_dir = "uploads/"; // Thư mục đích để lưu file
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$fileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
// Kiểm tra file đã tồn tại chưa
if (file_exists($target_file)) {
echo "File đã tồn tại.";
$uploadOk = 0;
}
// Kiểm tra kích thước file (ví dụ: chỉ cho phép file dưới 2MB)
if ($_FILES["fileToUpload"]["size"] > 2000000) {
echo "File quá lớn.";
$uploadOk = 0;
}
// Cho phép các định dạng file nhất định
if ($fileType != "jpg" && $fileType != "png" && $fileType != "jpeg" && $fileType != "gif") {
echo "Chỉ cho phép các file JPG, JPEG, PNG & GIF.";
$uploadOk = 0;
}
// Kiểm tra xem có lỗi không và nếu không thì di chuyển file tới thư mục đích
if ($uploadOk == 0) {
echo "File không được tải lên.";
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "File ". htmlspecialchars(basename($_FILES["fileToUpload"]["name"])) . " đã được tải lên thành công.";
} else {
echo "Đã xảy ra lỗi khi tải file.";
}
}
?>Giải thích:
$_FILES['fileToUpload']['name']: Lấy tên file tải lên.$_FILES['fileToUpload']['tmp_name']: Đường dẫn tạm thời của file trên máy chủ.move_uploaded_file(): Di chuyển file từ thư mục tạm thời đến thư mục đích.- Kiểm tra các điều kiện như file có tồn tại không, kích thước file, loại file (JPG, PNG, GIF).
4. Xác thực và bảo mật khi upload file
Việc upload file tiềm ẩn nhiều rủi ro bảo mật, chẳng hạn như tấn công bằng cách tải lên các file mã độc hoặc các file lớn quá mức. Dưới đây là một số biện pháp bảo mật cần áp dụng khi xử lý upload file:
4.1. Kiểm tra kích thước file
Chỉ cho phép tải lên các file có kích thước dưới một giới hạn nhất định (ví dụ: 2MB).
if ($_FILES["fileToUpload"]["size"] > 2000000) {
echo "File quá lớn.";
$uploadOk = 0;
}4.2. Kiểm tra loại file
Bạn nên hạn chế việc tải lên các định dạng file nguy hiểm. Chỉ cho phép các định dạng file mà bạn đã định nghĩa trước, ví dụ: .jpg, .png, .gif.
$fileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
if ($fileType != "jpg" && $fileType != "png" && $fileType != "jpeg" && $fileType != "gif") {
echo "Chỉ cho phép các file JPG, JPEG, PNG & GIF.";
$uploadOk = 0;
}4.3. Kiểm tra file đã tồn tại
Nếu không muốn file bị ghi đè, hãy kiểm tra xem file đó đã tồn tại trên máy chủ hay chưa.
if (file_exists($target_file)) {
echo "File đã tồn tại.";
$uploadOk = 0;
}4.4. Sử dụng tên file an toàn
Sử dụng hàm basename() và htmlspecialchars() để đảm bảo rằng tên file được xử lý an toàn và không chứa mã độc.
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);5. Tùy chỉnh cấu hình upload file trong PHP
PHP có các cài đặt cấu hình mặc định để kiểm soát việc upload file. Bạn có thể tùy chỉnh các thông số này trong tệp php.ini:
upload_max_filesize: Giới hạn kích thước tối đa của file có thể tải lên.post_max_size: Giới hạn tổng kích thước dữ liệu có thể được gửi thông qua phương thức POST.max_file_uploads: Giới hạn số lượng file có thể được tải lên trong một yêu cầu.
Ví dụ thay đổi trong php.ini:
upload_max_filesize = 5M
post_max_size = 8M
max_file_uploads = 20
6. Xử lý nhiều file cùng lúc
PHP hỗ trợ việc upload nhiều file cùng lúc bằng cách sử dụng thuộc tính multiple trong thẻ <input> và xử lý chúng với $_FILES như một mảng.
Ví dụ 3: Upload nhiều file cùng lúc
<form action="upload_multiple.php" method="post" enctype="multipart/form-data">
<label for="filesToUpload">Chọn các file để tải lên:</label>
<input type="file" name="filesToUpload[]" id="filesToUpload" multiple>
<button type="submit">Tải lên</button>
</form>Mã PHP để xử lý nhiều file (upload_multiple.php):
<?php
$target_dir = "uploads/";
$uploadOk = 1;
foreach ($_FILES["filesToUpload"]["tmp_name"] as $key => $tmp_name) {
$target_file = $target_dir . basename($_FILES["filesToUpload"]["name"][$key]);
$fileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
// Kiểm tra điều kiện (giống như ví dụ đơn file)
if ($_FILES["filesToUpload"]["size"][$key] > 2000000) {
echo "File quá lớn: " . $_FILES["filesToUpload"]["name"][$key];
$uploadOk = 0;
}
if ($fileType != "jpg" && $fileType != "png" && $fileType != "jpeg" && $fileType != "gif") {
echo "Chỉ cho phép JPG, JPEG, PNG & GIF: " . $_FILES["filesToUpload"]["name"][$key];
$uploadOk = 0;
}
// Di chuyển file
if ($uploadOk == 1) {
if (move_uploaded_file($_FILES["filesToUpload"]["tmp_name"][$key], $target_file)) {
echo "File " . htmlspecialchars(basename($_FILES["filesToUpload"]["name"][$key])) . " đã được tải lên.<br>";
} else {
echo "Đã xảy ra lỗi khi tải file: " . $_FILES["filesToUpload"]["name"][$key] . "<br>";
}
}
}
?>Giải thích: Chúng ta sử dụng vòng lặp foreach để xử lý từng file được chọn và tải lên từng file.
7. Kết luận
Upload file trong PHP là một tính năng không thể thiếu khi xây dựng các ứng dụng web hiện đại, từ việc cho phép người dùng tải lên tài liệu, hình ảnh, đến các loại dữ liệu khác. Việc xử lý file tải lên yêu cầu chú ý đến bảo mật và xác thực để tránh các cuộc tấn công tiềm ẩn.
Tóm tắt các bước chính:
- Tạo form HTML với thuộc tính
enctype="multipart/form-data"để cho phép tải file. - Sử dụng mảng
$_FILESđể xử lý thông tin file tải lên. - Kiểm tra loại file, kích thước file và bảo mật.
- Di chuyển file từ thư mục tạm thời vào thư mục đích bằng
move_uploaded_file().
Hy vọng rằng qua bài viết này, bạn đã có cái nhìn chi tiết và rõ ràng về cách xử lý upload file trong PHP.
Chúc bạn học tập hiệu quả trên CodeTutHub!









