Bài 22: 2 Bước Upload File lên Server trong PHP

“Hãy hòa nhã với những kẻ dở hơi. Ai biết được ngày sau bạn có thể phải làm việc cho một kẻ như vậy.”

Bill Gates

Microsoft

Trong bài học này, bạn sẽ tìm hiểu cách Upload File (tải tệp) lên Web Server từ xa trong PHP.

Trong khuôn khổ bài học này, chúng ta sẽ tìm hiểu cách upload file lên server từ xa bằng cách sử dụng biểu mẫu HTML và PHP đơn giản.

2 bước upload file trong PHP
2 bước upload file trong PHP

Bạn có thể tải lên bất kỳ loại tệp nào như hình ảnh, video, file ZIP, tài liệu Microsoft Office, PDF, cũng như các file thực thi và một loạt các loại tệp khác.

Bước 1: Tạo form HTML để sử dụng Upload file

Ở đây mình sẽ tạo form đơn giản để có thể upload file. Nếu bạn muốn đẹp hơn thì có thể thêm CSS vào nhé.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>File Upload Form</title>
</head>
<body>
    <form action="upload-manager.php" method="post" enctype="multipart/form-data">
        <h2>Upload File</h2>
        <label for="fileSelect">Filename:</label>
        <input type="file" name="photo" id="fileSelect">
        <input type="submit" name="submit" value="Upload">
        <p><strong>Note:</strong> Chỉ định dạng .jpg, .jpeg, .gif, .png và tối đa 5MB.</p>
    </form>
</body>
</html>

Lưu ý:

Ngoài trường file-select, form upload phải sử dụng phương thức 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 MIME mulitpart – đượ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, v.v.

Bước 2: Viết mã Upload file lên server trong PHP

Đây là chương trình hoàn chỉnh của tệp ‘upload-manager.php’ mà mình đã tạo.

Nó sẽ lưu trữ tệp đã tải lên trong thư mục ‘upload’ và thực hiện một số kiểm tra bảo mật cơ bản như loại tệp và kích thước tệp để đảm bảo rằng người dùng tải lên đúng loại tệp và trong giới hạn cho phép.

<?php
// Kiểm tra nếu form đã submit
if($_SERVER["REQUEST_METHOD"] == "POST"){
    // Kiểm tra xem file đã tải lên mà không có lỗi
    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 nhận phần mở rộng của file
        $ext = pathinfo($filename, PATHINFO_EXTENSION);
        if(!array_key_exists($ext, $allowed)) die("Error: Vui lòng chọn đúng định dạng file.");
    
        // Xác nhận kích thước file - tối đa 5MB
        $maxsize = 5 * 1024 * 1024;
        if($filesize > $maxsize) die("Error: Kích thước File quá lớn.");
    
        // Xác định loại file
        if(in_array($filetype, $allowed)){
            // Kiểm tra xem file có tồn tại trước khi upload hay không
            if(file_exists("upload/" . $filename)){
                echo $filename . " is already exists.";
            } else{
                move_uploaded_file($_FILES["photo"]["tmp_name"], "upload/" . $filename);
                echo "File của bạn đã upload thành công.";
            } 
        } else{
            echo "Error: Có vấn đề xảy ra trong quá trì Upload. vui lòng thử lại."; 
        }
    } else{
        echo "Error: " . $_FILES["photo"]["error"];
    }
}
?>

Lưu ý:

Chương trình trên ngăn chặn upload một tệp có cùng tên với một tệp hiện có trong cùng một thư mục.

Tuy nhiên, nếu bạn muốn cho phép tải tệp cùng tên chỉ cần thêm vào tên tệp bằng một chuỗi hoặc dấu thời gian ngẫu nhiên, như:

$ filename = time (). '_'. $ _FILES ['photo'] ['name'];

Đây là chương trình mình đã viết hoàn chỉnh. Bây giờ hãy đi vào chi tiết để xem cụ thể được viết như thế nào nhé:

Giải thích chương trình upload file trong PHP

Khi form được submit, tệp đã upload có thể được truy cập thông qua mảng siêu cấp có tên là $_FILES.

Ví dụ: Form Upload của chúng ta chứa trường select có tên là photo (tức là name=”photo”), nếu bất kỳ người dùng nào tải lên tệp bằng trường này, chúng ta có thể nhận được các chi tiết 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 trong khi thử upload thông qua mảng kết hợp $_FILES [“photo”], như thế này:

  • $ _FILES [‘photo’] [‘name’] : Giá trị mảng này chỉ định tên gốc của tệp, bao gồm cả phần mở rộng tệp. Nó không bao gồm đường dẫn tập tin.
  • $_FILES[“photo”][“type”] : Giá trị mảng này chỉ định loại tệp.
  • $_FILES[“photo”][“size”] : Giá trị mảng này chỉ định kích thước tệp, 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 sau khi được tải lên máy chủ.
  • $_FILES[“photo”][“error”] : Giá trị mảng này chỉ định lỗi hoặc trạng thái code được liên kết với tệp tải lên, ví dụ: nó sẽ là 0, nếu không có lỗi

Đoạn code PHP trong ví dụ sau sẽ chỉ hiển thị chi tiết thông tin của tệp được tải lên và lưu trữ nó trong một thư mục tạm thời trên web server.

<?php
if($_FILES["photo"]["error"] > 0){
    echo "Error: " . $_FILES["photo"]["error"] . "<br>";
} else{
    echo "File Name: " . $_FILES["photo"]["name"] . "<br>";
    echo "File Type: " . $_FILES["photo"]["type"] . "<br>";
    echo "File Size: " . ($_FILES["photo"]["size"] / 1024) . " KB<br>";
    echo "Stored in: " . $_FILES["photo"]["tmp_name"];
}
?>

Lưu ý:

Khi một tệp đã được tải lên thành công, nó sẽ tự động được lưu trữ trong một thư mục tạm thời trên máy chủ.

Để lưu trữ tệp này vĩnh viễn, bạn cần di chuyển nó từ thư mục tạm thời đến một vị trí cố định bằng cách sử dụng hàm move_uploaded_file() của PHP.

Tổng kết

Như vậy là bạn đã biết cách tải tệp (upload file) lên trên web server bằngN PHP. Bài tới chúng ta sẽ tìm hiểu về Download file

Có thể bạn muốn xem

Leave a reply

Please enter your comment!
Please enter your name here