PHP Cơ bản
PHP Nâng cao
PHP & Cơ sở dữ liệu MySQL
Ví dụ PHP
Tài liệu tham khảo PHP
Quảng cáo

Upload file trong PHP

Trong hướng dẫn này, bạn sẽ học cách tải tệp (upload file) lên máy chủ web từ xa bằng PHP.

Tải lên tệp (Upload file) bằng PHP

Trong hướng dẫn này, chúng ta sẽ học cách tải tệp lên máy chủ từ xa bằng cách sử dụng biểu mẫu HTML đơn giản và PHP. Bạn có thể tải lên bất kỳ loại tệp nào như hình ảnh, video, tệp ZIP, tài liệu Microsoft Office, PDF, cũng như tệp thực thi và nhiều loại tệp khác.

Bước 1: Tạo biểu mẫu HTML để tải tệp lên

Ví dụ sau sẽ tạo một biểu mẫu HTML đơn giản có thể được sử dụng để tải tệp lên.

Ví dụ

<!DOCTYPE html>
<html lang="vi">
<head>
    <meta charset="UTF-8">
    <title>Biểu mẫu Tải lên Tệp</title>
</head>
<body>
    <form action="upload-manager.php" method="post" enctype="multipart/form-data">
        <h2>Tải lên tệp</h2>
        <label for="fileSelect">Tên tệp:</label>
        <input type="file" name="photo" id="fileSelect">
        <input type="submit" name="submit" value="Tải lên">
        <p><strong>Chú ý:</strong>Chỉ những định dạng .jpg, .jpeg, .gif, .png với kích thước lớn nhất 5 MB được chấp nhận.</p>
    </form>
</body>
</html>

Ghi chú: Ngoài trường chọn tệp, biểu mẫu tải lên phải sử dụng phương thức HTTP 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 đa phần MIME - đượ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: Xử lý tệp đã tải lên

Đây là mã hoàn chỉnh của tệp "upload-manager.php" của chúng tôi. Nó sẽ lưu trữ tệp đã tải lên trong thư mục "upload" trên cơ sở thường xuyên thực hiện một số kiểm tra bảo mật cơ bản trước đó 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.

Ví dụ

<?php
// Kiểm tra xem biểu mẫu đã được gửi chưa
if($_SERVER["REQUEST_METHOD"] == "POST"){
    // Kiểm tra xem tệp đã được tải lên mà không có lỗi hay không
    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 minh phần mở rộng tệp
        $ext = pathinfo($filename, PATHINFO_EXTENSION);
        if(!array_key_exists($ext, $allowed)) die("Lỗi: Vui lòng chọn định dạng tệp hợp lệ.");
    
        // Xác minh kích thước tệp - tối đa 5MB
        $maxsize = 5 * 1024 * 1024;
        if($filesize > $maxsize) die("Lỗi: Kích thước tệp lớn hơn giới hạn cho phép.");
    
        // Xác minh loại MIME của tệp
        if(in_array($filetype, $allowed)){
            // Kiểm tra xem tệp có tồn tại hay không trước khi tải lên
            if(file_exists("upload/" . $filename)){
                echo $filename . " đã tồn tại.";
            } else{
                move_uploaded_file($_FILES["photo"]["tmp_name"], "upload/" . $filename);
                echo "Tệp của bạn đã đăng tải thành công";
            } 
        } else{
            echo "Lỗi: Đã xảy ra sự cố khi tải tệp của bạn lên. Vui lòng thử lại."; 
        }
    } else{
        echo "Error: " . $_FILES["photo"]["error"];
    }
}
?>

Ghi chú: Tập lệnh trên ngăn không cho tải lên tệp có cùng tên với 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 điều này, chỉ cần thêm trước tên tệp với một chuỗi hoặc dấu thời gian ngẫu nhiên, như $filename = time() . '_' . $_FILES["photo"]["name"];

Có thể bạn đang thắc mắc code này có ý nghĩa như thế nào? Vâng, chúng ta hãy lần lượt xem qua từng phần của mã ví dụ này để hiểu rõ hơn về quy trình này.

Giải thích mã

Sau khi biểu mẫu được gửi, thông tin về tệp đã tải lên có thể được truy cập thông qua mảng superglobal trong PHP được gọi $_FILES. Ví dụ: biểu mẫu tải lên của chúng tôi chứa trường chọn tệp có tên là ảnh (tức là name="photo"), nếu bất kỳ người dùng nào đã tải tệp lên bằng trường này, chúng tôi có thể lấy thông tin chi tiết của nó 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 khi cố tải lên 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 của tệp. Nó không bao gồm đường dẫn tệp.
  • $_FILES["photo"]["type"] - Giá trị mảng này chỉ định kiểu MIME của 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 nó đã được tải lên máy chủ.
  • $_FILES["photo"]["error"] - Giá trị mảng này chỉ định lỗi hoặc mã trạng thái liên quan đến việc tải lên tệp, ví dụ: nó sẽ là 0, nếu không có lỗi.

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

Ví dụ

<?php
if($_FILES["photo"]["error"] > 0){
    echo "Lỗi: " . $_FILES["photo"]["error"] . "<br>";
} else{
    echo "Tên tệp: " . $_FILES["photo"]["name"] . "<br>";
    echo "Loại tệp: " . $_FILES["photo"]["type"] . "<br>";
    echo "Kích cỡ: " . ($_FILES["photo"]["size"] / 1024) . " KB<br>";
    echo "Được lưu trữ tại: " . $_FILES["photo"]["tmp_name"];
}
?>

Mẹo: Khi tệp đã được tải lên thành công, tệp sẽ tự động được lưu trữ trong thư mục tạm thời trên máy chủ. Để lưu trữ tệp này thường xuyên, bạn cần phải di chuyển tệp từ thư mục tạm thời đến vị trí cố định bằng cách sử dụng hàm move_uploaded_file() trong PHP.

Bài viết này đã giúp ích cho bạn?

Advertisements