Với PHP việc tải tệp lên máy chủ khá dễ dàng. Tuy nhiên thì càng dễ thì càng đi kèm với một số nguy hiểm, vì vậy mà hãy cẩn thận nhé!

Khi ta upload một file lên thì trên Server sẽ nhận được 5 thông số cho một file, và PHP sẽ dựa vào các thông số đó để tiến hành upload, các thông số đó là:

  • name: Tên của file bạn upload
  • type: Kiểu file mà bạn upload (hình ảnh, word, …)
  • tmp_name: Đường dẫn đến file upload ở client
  • error: Trạng thái của file bạn upload, 0 => không có lỗi
  • size: Kích thước của file bạn upload

1. Tạo một biểu mẫu HTML

Đầu tiên ta sẽ phải tạo một biểu mẫu HTML cho người dùng chọn tệp. Để upload file lên Server thì ban phải sử dụng form có thuộc tính enctype=”multipart/form-data” và phương thức POST, thẻ input sẽ có type=”file”.

<!DOCTYPE html>
<html>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
Chọn hình ảnh để tải lên:
  <input type="file" name="fileToUpload" id="fileToUpload">
  <input type="submit" value="Upload Image" name="submit">
</form>
</body>
</html>

Một số quy tắc cần tuân theo cho biểu mẫu HTML ở trên:

  • Đảm bảo rằng biểu mẫu sử dụng method = “post”
  • Biểu mẫu cũng cần thuộc tính sau: enctype = “multipart / form-data”. Nó chỉ định loại nội dung sẽ sử dụng khi gửi biểu mẫu

Nếu không có các yêu cầu ở trên, quá trình tải lên tệp sẽ không hoạt động.

Biểu mẫu ở trên gửi dữ liệu đến một tệp có tên “upload.php”, tệp này chúng ta sẽ tạo tiếp theo.

2. File PHP

Ta sẽ tạo một file là upload.php và code để tải tệp lên:

<?php
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
//Kiểm tra xem tệp hình ảnh là hình ảnh thực tế hay hình ảnh giả mạo
if(isset($_POST["submit"])) {
  $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
  if($check !== false) {
    echo "File is an image - " . $check["mime"] . ".";
    $uploadOk = 1;
  } else {
    echo "Tệp không phải là hình ảnh.";
    $uploadOk = 0;
  }
}
?>

Mình sẽ giải thích một số câu lệnh:

  • $target_dir = “uploads /” – chỉ định thư mục nơi tệp sẽ được đặt
  • $target_file chỉ định đường dẫn của tệp sẽ được tải lên
  • $uploadOk = 1 chưa được sử dụng (sẽ được sử dụng sau)
  • $imageFileType giữ phần mở rộng tệp của tệp (chữ thường)
  • Tiếp theo, kiểm tra xem file ảnh là ảnh thật hay ảnh giả

Lưu ý

Bạn sẽ cần tạo một thư mục mới có tên “uploads” trong thư mục chứa tệp “upload.php”. Các tệp đã tải lên sẽ được lưu ở đó.

3. Kiểm tra tồn tại của file trong PHP

Chúng ta sẽ kiểm tra tệp đã tồn tại trong thư mục uploads hay chưa. Nếu có, một thông báo lỗi sẽ hiển thị và $uploadOk được đặt thành 0:

// kiểm tra tồn tại của file
if (file_exists($target_file)) {
  echo "Xin lỗi, tệp đã tồn tại.";
  $uploadOk = 0;
}

4. Giới hạn loại tệp và giới hạn kích thước tệp

Trường nhập tệp trong biểu mẫu HTML của chúng ta ở trên được đặt tên là “fileToUpload”. Bây giờ, chúng ta muốn kiểm tra kích thước của tệp. Nếu tệp lớn hơn 500KB, một thông báo lỗi sẽ hiển thị và $uploadOk được đặt thành 0:

//kiểm tra kích thước file
if ($_FILES["fileToUpload"]["size"] > 500000) {
  echo "Xin lỗi, tệp của bạn quá lớn.";
  $uploadOk = 0;
}

Đoạn mã dưới đây chỉ cho phép người dùng tải lên các tệp JPG, JPEG, PNG và GIF. Tất cả các loại tệp khác đều đưa ra thông báo lỗi trước khi đặt $uploadOk thành 0:

// Cho phép các định dạng tệp nhất định
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
  echo "Xin lỗi, chỉ cho phép các tệp JPG, JPEG, PNG & GIF.";
  $uploadOk = 0;
}

5. Hoàn thành file PHP để tải hình ảnh

Các bạn có thể ghép các phần trên lại để thành một file upload.php hoàn chỉnh. Và nó sẽ tương tự như sau:

<?php
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

//Kiểm tra xem tệp hình ảnh là hình ảnh thực tế hay hình ảnh giả mạo
if(isset($_POST["submit"])) {
  $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
  if($check !== false) {
    echo "Tệp là một hình ảnh - " . $check["mime"] . ".";
    $uploadOk = 1;
  } else {
    echo "Tệp không phải là hình ảnh.";
    $uploadOk = 0;
  }
}

// Kiểm tra xem tệp đã tồn tại chưa
if (file_exists($target_file)) {
  echo "Xin lỗi, tệp đã tồn tại.";
  $uploadOk = 0;
}

// Kiểm tra kích thước tệp
if ($_FILES["fileToUpload"]["size"] > 500000) {
  echo "Xin lỗi, tệp của bạn quá lớn.";
  $uploadOk = 0;
}

// Cho phép các định dạng tệp nhất định
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
  echo "Xin lỗi, chỉ cho phép các tệp JPG, JPEG, PNG & GIF.";
  $uploadOk = 0;
}

// Kiểm tra xem $ uploadOk có được đặt thành 0 do lỗi không
if ($uploadOk == 0) {
  echo "Xin lỗi, tệp của bạn không được tải lên.";
//nếu mọi thứ đều ổn, hãy cố gắng tải tệp lên
} else {
  if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
    echo "Tập tin ". htmlspecialchars( basename( $_FILES["fileToUpload"]["name"])). "đã được tải lên.";
  } else {
    echo "Xin lỗi, đã xảy ra lỗi khi tải tệp của bạn lên.";
  }
}
?>

Lưu ý

Nếu bạn muốn trang của mình tự reset lại thì các bạn có thể thêm đoạn code sau vào cuối file upload.php:

echo header("refresh: 5; url = http://localhost/index.php");
exit();

Trong đó:

  • refresh: 5 là thời gian mà trang sẽ tự động tải lại và ở đây thời gian là 5s.
  • url = http://localhost/index.php là trang mà sẽ tải lại về sau 5s. Ở đây chính là file index.php.