Upload file trong PHP

Với PHP, thật dễ dàng để tải các file lên máy chủ. Tuy nhiên, cũng tiềm ẩn rất nhiều nguy hiểm, vì vậy hãy luôn cẩn thận khi cho phép tải file lên máy chủ!

Cấu hình file "php.ini"

Đầu tiên, đảm bảo rằng PHP được cấu hình để cho phép tải file lên máy chủ.

Trong file "php.ini" của bạn, tìm kiếm dòng cấu hình file_uploads và thiết lập thành On như dưới đây:

file_uploads = On

Tạo biểu mẫu HTML

Tiếp theo, tạo một biểu mẫu HTML cho phép người dùng chọn file hình ảnh họ muốn tải lên như sau:

<!DOCTYPE html>
<html>

<body>

    <form action="upload.php" method="post" enctype="multipart/form-data">
        Select image to upload:
        <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 đối với biểu mẫu HTML để cho phép tải file lên máy chủ:

  • Đảm bảo rằng biểu mẫu sử dụng phương thức 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.

Không có các yêu cầu ở trên, bạn sẽ không thể sử dụng biểu mẫu để tải file lên máy chủ.

Những điều khác cần chú ý: Thuộc tính type="file" của thẻ <input> hiển thị trường đầu vào dưới dạng điều khiển chọn file, với nút "Browse" sẽ nằm bên cạnh điều khiển đầu vào để người dùng chọn file.

Biểu mẫu ở trên sẽ gửi dữ liệu tới một file có tên là "upload.php", chúng tôi sẽ tạo file này ở phần tiếp theo.

Tạo tập lệnh upload file trong PHP

File "upload.php" chứa mã để tải file lên server trông sẽ như sau:

<?php
    $target_dir = "uploads/";
    $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
    $uploadOk = 1;
    $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
    
    // Check if image file is a actual image or fake image
    if(isset($_POST["submit"])) {
        $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
        
        if($check !== false) {
            echo "File is an image - " . $check["mime"] . ".";
            $uploadOk = 1;
        } else {
            echo "File is not an image.";
            $uploadOk = 0;
        }
    }
?>

Giải thích các thành phần trong tập lệnh PHP:

  • $target_dir = "uploads/" - chỉ định thư mục chứa file được tải lên.
  • $target_file - chỉ định đường dẫn của file sẽ được tải lên.
  • $uploadOk = 1 - chưa được sử dụng (sẽ được sử dụng sau).
  • $imageFileType - chứa thông tin mở rộng của file (bằng chữ thường)
  • $check - kiểm tra xem file hình ảnh là hình ảnh thật hay hình ả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 file "upload.php". Các tập tin tải lên sẽ được lưu ở đó.

Bây giờ chúng ta có thể thêm một số điều kiện để kiểm tra file như sau:

Kiểm tra nếu file đã tồn tại

Đầu tiên, chúng tôi sẽ kiểm tra xem file đã tồn tại trong thư mục "uploads" chưa. Nếu file đã tồn tại, hiển thị thông báo lỗi và $uploadOk được đặt thành 0:


// Check if file already exists
if (file_exists($target_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
}

Giới hạn kích thước file

Trường nhập file trong biểu mẫu HTML của chúng tôi ở trên có tên là "fileToUpload".

Bây giờ, chúng tôi muốn kiểm tra kích thước của file. Nếu file lớn hơn 500KB sẽ hiển thị thông báo lỗi và $uploadOk được đặt thành 0:


// Check file size
if ($_FILES["fileToUpload"]["size"] > 500000) {
    echo "Sorry, your file is too large.";
    $uploadOk = 0;
}

Giới hạn loại file

Mã dưới đây chỉ cho phép người dùng tải lên các file có định dạng là JPG, JPEG, PNG và GIF. Tất cả các loại file khác sẽ đưa ra thông báo lỗi và thiết lập $uploadOk thành 0:


// Allow certain file formats
if($imageFileType != "jpg" &&
   $imageFileType != "png" &&
   $imageFileType != "jpeg" &&
   $imageFileType != "gif") {
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
    $uploadOk = 0;
}

Tập lệnh upload file PHP hoàn chỉnh

File "upload.php" hoàn chỉnh trông như thế này:

<?php
    $target_dir = "uploads/";
    $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
    $uploadOk = 1;
    $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
    // Check if image file is a actual image or fake image
    if(isset($_POST["submit"])) {
        $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
        if($check !== false) {
            echo "File is an image - " . $check["mime"] . ".";
            $uploadOk = 1;
        } else {
            echo "File is not an image.";
            $uploadOk = 0;
        }
    }
    // Check if file already exists
    if (file_exists($target_file)) {
        echo "Sorry, file already exists.";
        $uploadOk = 0;
    }
    // Check file size
    if ($_FILES["fileToUpload"]["size"] > 500000) {
        echo "Sorry, your file is too large.";
        $uploadOk = 0;
    }
    // Allow certain file formats
    if($imageFileType != "jpg" && 
       $imageFileType != "png" && 
       $imageFileType != "jpeg" && 
       $imageFileType != "gif" ) {
        echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
        $uploadOk = 0;
    }
    // Check if $uploadOk is set to 0 by an error
    if ($uploadOk == 0) {
        echo "Sorry, your file was not uploaded.";
    // if everything is ok, try to upload file
    } else {
        if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
            echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
        } else {
            echo "Sorry, there was an error uploading your file.";
        }
    }
?>


Bài viết liên quan:

Hướng dẫn lập trình PHP toàn tập sẽ giúp bạn từng bước tìm hiểu và nắm vững ngôn ngữ lập trình PHP.

Hướng dẫn cách truy xuất, lọc, sắp xếp dữ liệu MySQL trong PHP sử dụng MySQLi và PDO.

MySQL prepared statements trong PHP rất hữu ích để chống lại các cuộc tấn công SQL Injection.