Liên hệ
Ủng hộ, đăng ký theo dõi kênh

Upload file trong PHP

Xây dựng form upload file và xử lý code PHP để lưu lại file đã upload từ biến $_FILE và các hàm move_uploaded_file

Tổng quan: để HTML FORM có thể gửi file lên server thì form phải có thuộc tính enctype="multipart/form-data", phần tử trong form để gửi file có dạng <input type="file" name="myfile" ... />

Khi file Upload lên Server thì file sẽ lưu vào một thư mục tạm của hệ thống PHP, và toàn bộ thông tin về file upload sẽ lưu trong biến mảng $_FILES

Ví dụ:

array (size=1)
    'myfile' =>
        array (size=5)
            'name' => string 'somefile.txt' (length=12)
            'type' => string 'text/plain' (length=10)
            'tmp_name' => string '/tmp/phpDC66.tmp' (length=16)
            'error' => int 0
            'size' => int 18
  • name -- tên gốc của file.
  • type -- MIME 41
  • tmp_name -- lưu tạm file upload.
  • error -- Mã lỗi, nếu mã này bằng 0 là không lỗi.
  • size -- Cỡ file.

Bằng việc đọc $_FILES bạn sẽ biết các thông tin về file được upload, nơi file đang lưu tạm, bạn cần phải xử lý bằng các hàm PHP để di chuyển file ra một vị trí theo cấu trúc thư mục của ứng dụng.

Nếu sau khi upload vào thư mục tạm một thời gian (như trên là /tmp/) một thời gian (do cấu hình hệ thống) mà bạn không di chuyển nó đến vị trí thích hợp, nó sẽ tự xóa.

Tạo form HTML upload file

Để thực hành upload file trong PHP, trước tiên tạo form cho phép người dùng chọn file và gửi file đó lên server. Giả sử code PHP để xử lý upload các file hình ảnh nằm ở /uploadimg.php thì bạn có thể xây dựng form như sau:

<!DOCTYPE html>
<html>
<body>
<form action="/upload.php" method="post" enctype="multipart/form-data">
    Chọn file để upload:
    <input type="file" name="fileupload" id="fileupload">
    <input type="submit" value="Đăng ảnh" name="submit">
</form>
</body>
</html>

Hiện thị form có dạng:

Chọn file để upload:

Lưu ý khi tạo form để uplad ảnh (file) thì cần thiết đặt thuộc tính form có
method="post" enctype="multipart/form-data"
Phần tử chọn file trong form là input với kiểu type="file"

Code PHP xử lý Upload

Code xử lý upload sau là xử lý chỉ cho upload các file ảnh, với các loại file là jpg, png, jpeg, gif. File Upload file có cỡ < 0.8 MB. File Upload sẽ lưu vào thư mục uploads

Code xử lý upload file để trong file /upload.php có nội dung như sau:

<?php
//Thư mục bạn sẽ lưu file upload
$target_dir    = "uploads/";
//Vị trí file lưu tạm trong server
$target_file   = $target_dir . basename($_FILES["fileupload"]["name"]);
$allowUpload   = true;
//Lấy phần mở rộng của file
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
$maxfilesize   = 800000; //(bytes)
////Những loại file được phép upload
$allowtypes    = array('jpg', 'png', 'jpeg', 'gif');


if(isset($_POST["submit"])) {
    //Kiểm tra xem có phải là ảnh
    $check = getimagesize($_FILES["fileupload"]["tmp_name"]);
    if($check !== false) {
        echo "Đây là file ảnh - " . $check["mime"] . ".";
        $allowUpload = true;
    } else {
        echo "Không phải file ảnh.";
        $allowUpload = false;
    }
}

// Kiểm tra nếu file đã tồn tại thì không cho phép ghi đè
if (file_exists($target_file)) {
    echo "File đã tồn tại.";
    $allowUpload = false;
}
// Kiểm tra kích thước file upload cho vượt quá giới hạn cho phép
if ($_FILES["fileupload"]["size"] > $maxfilesize)
{
    echo "Không được upload ảnh lớn hơn $maxfilesize (bytes).";
    $allowUpload = false;
}


// Kiểm tra kiểu file
if (!in_array($imageFileType,$allowtypes ))
{
    echo "Chỉ được upload các định dạng JPG, PNG, JPEG, GIF";
    $allowUpload = false;
}

// Check if $uploadOk is set to 0 by an error
if ($allowUpload) {
    if (move_uploaded_file($_FILES["fileupload"]["tmp_name"], $target_file))
    {
        echo "File ". basename( $_FILES["fileupload"]["name"]).
        " Đã upload thành công";
    }
    else
    {
        echo "Có lỗi xảy ra khi upload file.";
    }
}
else
{
    echo "Không upload được file!";
}
?>

Giải thích code trên:

Các fileform HTML upload nên, được PHP lưu ở một thư mục tạm hệ thống, và tất cả các thông tin về file được lưu ở biến mảng $_FILE, cấu trúc biến này như sau:

$_FILE = Array
    (
        [file1] => Array
            (
                [name] => 'test2.txt';//một tên file người dùng upload
                [type] => text/plain  (kiểu nội dung file text)
                [tmp_name] => /tmp/php/php1h4j1 //vị trí lưu file tạm thời trên server.
                [error] => UPLOAD_ERR_OK (= 0 là không lỗi)
                [size] => 123   (kích thước file - bype)
            )

        [file2] => Array
            (
                [name] => test.jpg
                [type] => image/jpeg
                [tmp_name] => /tmp/php/php6hst32
                [error] => UPLOAD_ERR_OK
                [size] => 98174
            )
    )

file1, file2 ... tên key tương ứng với tên phần tử form upload file, ví dụ trên là fileupload

Như vậy khi xủ lý upload file, bạn truy cập vào $_FILE và di chuyển file vừa upload từ tmp_name sang vị trí mới bạn muốn lưu $target_file bằng hàm move_uploaded_file($_FILES["fileupload"]["tmp_name"],$target_file )

Kiểm tra file upload có phải là file ảnh (dùng cho trường hợp bạn chỉ cho phép up ảnh) thì đầu tiên gọi getimagesize() để xem kích thước ảnh, nếu hàm phân tích được có nghĩa là ảnh, ngược lại là một loại file khác.

Kiểm tra phần mở rộng của tên file: Lấy phần mở rộng $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); rồi so sánh với các mẫu cho phép.

Code PHP Upload nhiều File

Trong thẻ <input /> nếu có thuộc tính multiple="multiple" và tên phần tử chỉ ra là mảng, thì cho phép chọn một lúc nhiều file để upload.

Ví dụ HTML như sau:

<input name="fileupload[]" type="file" multiple="multiple" />

Lúc này tại PHP $_FILES['fileupload'] sẽ chứa 5 mảng

  • $_FILES['fileupload']['name'] chứa các tên file upload
  • $_FILES['fileupload']['type'] các kiểu MIME 41
  • $_FILES['fileupload']['tmp_name'] chứa các vị trí lưu tạm file
  • $_FILES['fileupload']['error'] mảng báo lỗi
  • $_FILES['fileupload']['size'] kích thước file

Đoạn code sau hiện thị FORM để bạn chọn một lúc nhiều file upload, sau đó code PHP sẽ hiện thị các thông tin về các file mà bạn upload lên. Hãy chạy và chọn thử nhiều file upload để kiểm tra

<?php

if (($_SERVER['REQUEST_METHOD'] === 'POST') &&
    (isset($_FILES['fileupload']))) {

    $files = $_FILES['fileupload'];

        $names      = $files['name'];
        $types      = $files['type'];
        $tmp_names  = $files['tmp_name'];
        $errors     = $files['error'];
        $sizes      = $files['size'];


        $numitems = count($names);
        $numfiles = 0;
        for ($i = 0; $i < $numitems; $i ++) {
            //Kiểm tra file thứ $i trong mảng file, up thành công không
            if ($errors[$i] == 0)
            {
                $numfiles++;
                echo "Bạn upload file thứ $numfiles:<br>";
                echo "Tên file: $names[$i] <br>";
                echo "Lưu tại: $tmp_names[$i] <br>";
                echo "Cỡ file: $sizes[$i] <br><hr>";

                //Code xử lý di chuyển file đến thư mục cần thiết ở đây
                //Ví dụ move_uploaded_file($tmp_names[$i], /upload/'.$names[$i]);

            }
        }
        echo "Tổng số file upload: " .$numfiles;
}
?>

<form method="post" enctype="multipart/form-data">
    <p>Chọn file để upload:
      (Cỡ lớn nhất mà PHP đang cấu hình cho phép upload là
      <?=ini_get('upload_max_filesize')?>)</p>

    <input name="fileupload[]" type="file" multiple="multiple" />
    <input type="submit" value="Đăng ảnh" name="submit">
</form>

Vui lòng đăng ký ủng hộ kênh