Upload file trong PHP – lý thuyết và xử lý

jk5587725

By jk5587725

Cập nhật Tháng 9 23, 2025

Trong rất nhiều ứng dụng web thực tế, việc cho phép người dùng upload hình ảnh đại diện, file tài liệu, hay thậm chí là những tệp media là một tính năng gần như không thể thiếu. Nếu bạn đang xây dựng một form đăng ký thành viên có ảnh đại diện, hay một hệ thống quản lý hồ sơ, thì kỹ năng xử lý upload file trong PHP chính là chiếc chìa khóa mở ra cánh cửa đó.

Hôm nay chúng ta sẽ khám phá một chủ đề rất thường gặp nhưng cũng dễ gây rối cho người mới — đó là làm sao để upload một file từ trình duyệt về server, kiểm soát định dạng, dung lượng, và xử lý file đó một cách an toàn.


Tại sao việc upload file cần cẩn thận?

Upload file nếu làm không đúng cách có thể tạo ra lỗ hổng bảo mật nghiêm trọng, ví dụ như hacker upload file thực thi mã độc hoặc phá vỡ cấu trúc server của bạn. Vì vậy, lý thuyết và các bước kiểm tra khi xử lý file là cực kỳ quan trọng.


Cấu trúc form upload file

Trước hết, bạn cần có một biểu mẫu HTML dùng enctype="multipart/form-data" để có thể gửi dữ liệu file:

<form method="POST" enctype="multipart/form-data">
  <input type="file" name="avatar">
  <button type="submit">Upload</button>
</form>

Lưu ý:

  • Không có enctype="multipart/form-data" là file không gửi được!
  • Input type="file" là yêu cầu bắt buộc.

Xử lý upload trong PHP

Khi người dùng submit form, PHP sẽ lưu thông tin file upload vào biến $_FILES. Dưới đây là ví dụ đơn giản:

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $file = $_FILES["avatar"];

  echo "Tên file: " . $file["name"] . "<br>";
  echo "Loại file: " . $file["type"] . "<br>";
  echo "Dung lượng: " . $file["size"] . " bytes<br>";
  echo "File tạm: " . $file["tmp_name"] . "<br>";
  echo "Lỗi (nếu có): " . $file["error"] . "<br>";
}

Lưu file về thư mục server

Chúng ta sẽ sử dụng move_uploaded_file() để chuyển file từ thư mục tạm sang thư mục lưu trữ chính thức:

$upload_dir = "uploads/";
$target_file = $upload_dir . basename($file["name"]);

if (move_uploaded_file($file["tmp_name"], $target_file)) {
  echo "Upload thành công!";
} else {
  echo "Đã có lỗi khi upload.";
}

Kiểm tra an toàn trước khi lưu file

Một vài kiểm tra bắt buộc:

$allowed_types = ['image/jpeg', 'image/png', 'image/gif'];
$max_size = 2 * 1024 * 1024; // 2MB

if (!in_array($file['type'], $allowed_types)) {
  echo "Chỉ cho phép upload hình ảnh JPG, PNG, GIF.";
} elseif ($file['size'] > $max_size) {
  echo "File quá lớn. Dung lượng tối đa là 2MB.";
} elseif ($file['error'] !== 0) {
  echo "Có lỗi trong quá trình upload.";
} else {
  // Upload an toàn
}

Bạn cũng nên đặt tên lại file để tránh trùng hoặc chứa ký tự lạ:

$new_name = uniqid() . "-" . basename($file["name"]);
move_uploaded_file($file["tmp_name"], $upload_dir . $new_name);

Tổng kết

Kỹ thuật upload file trong PHP không hề khó, nhưng cần bạn có tư duy bảo mật từ đầu. Bài học hôm nay giúp bạn:

  • Tạo form upload đúng chuẩn
  • Xử lý file từ $_FILES
  • Kiểm tra định dạng, kích thước, lỗi
  • Lưu file an toàn vào server

Bài tiếp theo chúng ta sẽ làm quen với Cookie và Session – hai “người gác cổng” cho dữ liệu tạm thời trên web. Một trong hai sẽ khiến bạn thốt lên “Sao mà tiện dữ vậy!”.

Thảo luận

Email 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 *

Đăng ký nhận tin mới

Nhận bài học, tài nguyên và cơ hội việc làm qua email hàng tuần.

[global_subscribe_form]

Chúng tôi cam kết không spam. Bạn có thể hủy bất cứ lúc nào.