์จ๋ผ์ธ ๊ฐ์
>PHP - ์ค๊ธ
๐ PHP ์ค๊ธ - 4์ฃผ์ฐจ: ํ์ผ ์ ๋ก๋ ๋ฐ ์ด๋ฏธ์ง ์ฒ๋ฆฌ - 02 $_FILES ์ํผ ๊ธ๋ก๋ฒ ๋ณ์
				์ฃผ์ ํ๋ก๊ทธ๋จ ์คํ
- ํ์ : 10.0
 - ๋ผ์ด์ ์ค: free
 - ์ด์์ฒด์ :
 - ํ์ผ ํฌ๊ธฐ: 0
 
ํผ๋๋ฐฑ ๋ฐ ๋ค์ด๋ก๋
- ์ฌ์ฉ์ ํ์ : 10.0
 - ๋ค์ด๋ก๋ ์: 1
 - ์กฐํ์: 71
 
์ ์กฐ์ฌ ๋ฐ ๋ฑ๋ก ์ ๋ณด
- ์ ์์ฌ: LUZENSOFT
 - ๋ฑ๋ก์ผ: 2025-07-25 09:38:57
 
- ์ค๋ช
๐ PHP ์ค๊ธ - 4์ฃผ์ฐจ: ํ์ผ ์ ๋ก๋ ๋ฐ ์ด๋ฏธ์ง ์ฒ๋ฆฌ - 02 $_FILES ์ํผ ๊ธ๋ก๋ฒ ๋ณ์
์ง๋ ์๊ฐ์๋ #HTML #ํผ์ ์ด์ฉํด #ํ์ผ์_์
๋ก๋ํ๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ๊ณผ #๋ณด์_๊ณ ๋ ค์ฌํญ์ ๋ํด ์์๋ณด์์ต๋๋ค. ์ด์  ์ฌ์ฉ์๊ฐ ์ ์กํ #ํ์ผ_๋ฐ์ดํฐ๊ฐ #PHP ์คํฌ๋ฆฝํธ์์ ์ด๋ป๊ฒ ์ ๊ทผ๋๊ณ  ์ฒ๋ฆฌ๋๋์ง์ ๋ํ ํต์ฌ์ธ #$_FILES #์ํผ_๊ธ๋ก๋ฒ_๋ณ์(Super Global Variable)์ ๋ํด ๊น์ด ์๊ฒ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค. #$_FILES ๋ณ์๋ฅผ ์ ํํ ์ดํดํ๊ณ  ํ์ฉํ๋ ๊ฒ์ด #์์ ํ๊ณ  #ํจ์จ์ ์ธ #ํ์ผ_์
๋ก๋_์ฒ๋ฆฌ(#File Upload Handling)์ ์์์
๋๋ค.
1. $_FILES ์ํผ ๊ธ๋ก๋ฒ ๋ณ์์ ์ดํด
#$_FILES๋ #PHP๊ฐ #HTTP_POST_๋ฉ์๋๋ฅผ ํตํด #์
๋ก๋๋_ํ์ผ์_์ ๋ณด๋ฅผ_์๋์ผ๋ก_์์งํ์ฌ_์ ์ฅํ๋ #์ฐ๊ด_๋ฐฐ์ด(Associative Array)์
๋๋ค. ์ด ๋ณ์๋ ์ค์ง #enctype="multipart/form-data"๋ก ์ค์ ๋ #HTML #ํผ์์๋ง ์ ํจํ๊ฒ ์ฑ์์ง๋๋ค.
$_FILES ๋ฐฐ์ด์ #ํผ์ #input type="file" ํ๊ทธ์ #name ์์ฑ ๊ฐ์ #ํค(Key)๋ก ์ฌ์ฉํ๋ฉฐ, ๊ฐ ํ์ผ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ๋ด๊ณ  ์๋ ๋ ๋ค๋ฅธ ๋ฐฐ์ด์ ๊ฐ์ผ๋ก ๊ฐ์ง๋๋ค.
$_FILES ๋ฐฐ์ด์ ์ฃผ์ ์์
$_FILES['input_name'] (์ฌ๊ธฐ์ input_name์ HTML <input type="file"> ํ๊ทธ์ name ์์ฑ ๊ฐ)์ ๋ค์๊ณผ ๊ฐ์ 5๊ฐ์ง ์ฃผ์ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค.
name: ํด๋ผ์ด์ธํธ #์ปดํจํฐ์์ #์ ๋ก๋๋_ํ์ผ์ #์๋ณธ_์ด๋ฆ(Original Name)์ ๋๋ค. ์ฌ์ฉ์๊ฐ ์ ํํ ํ์ผ์ ์ค์  ์ด๋ฆ์ ๋ํ๋ ๋๋ค.์์:
my_document.pdf
type: ์ ๋ก๋๋ ํ์ผ์ #MIME_ํ์ (MIME Type)์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๊ณตํ๋ ์ ๋ณด์ด๋ฏ๋ก, #๋ณด์_๊ฒ์ฌ_์_์ด_๊ฐ์๋ง_์์กดํด์๋_์_๋ฉ๋๋ค. ์ด ๊ฐ์ ํด๋ผ์ด์ธํธ ์ธก์์ ์ฝ๊ฒ ์๋ณ์กฐ๋ ์ ์์ต๋๋ค.์์:
image/jpeg,application/pdf,text/plain
tmp_name: ์๋ฒ์ #์์๋ก_์ ์ฅ๋_ํ์ผ์ #์ ์ฒด_๊ฒฝ๋ก์_์ด๋ฆ์ ๋๋ค. ์ ๋ก๋๋ ํ์ผ์ ์๋ฒ์ ํน์  ์์ ๋๋ ํฐ๋ฆฌ(php.ini์upload_tmp_dir์ค์  ๋๋ ์์คํ  ๊ธฐ๋ณธ ์์ ๋๋ ํฐ๋ฆฌ)์ ์ ์ฅ๋ฉ๋๋ค. #PHP_์คํฌ๋ฆฝํธ์์ ์ด ์์ ํ์ผ์ ์ฝ๊ฑฐ๋ ์๊ตฌ์ ์ธ ์์น๋ก ์ด๋์์ผ์ผ ํฉ๋๋ค.์์:
/tmp/phpA2F3g5(๋ฆฌ๋ ์ค),C:WindowsTempphp1A2B.tmp(์๋์ฐ)
error: #ํ์ผ_์ ๋ก๋_์_๋ฐ์ํ_์ค๋ฅ๋ฅผ_๋ํ๋ด๋_์ค๋ฅ_์ฝ๋(Error Code)์ ๋๋ค. #UPLOAD_ERR_OK(๊ฐ: 0)๋ ํ์ผ์ด ์ฑ๊ณต์ ์ผ๋ก ์ ๋ก๋๋์์์ ์๋ฏธํ๋ฉฐ, ๋ค๋ฅธ ๊ฐ๋ค์ ์ค๋ฅ๋ฅผ ๋ํ๋ ๋๋ค.UPLOAD_ERR_OK(0): ์ค๋ฅ ์์ด ํ์ผ ์ ๋ก๋ ์ฑ๊ณต.UPLOAD_ERR_INI_SIZE(1):php.ini์upload_max_filesize๋ฅผ ์ด๊ณผ.UPLOAD_ERR_FORM_SIZE(2): HTML ํผ์MAX_FILE_SIZE๊ฐ์ ์ด๊ณผ.UPLOAD_ERR_PARTIAL(3): ํ์ผ์ด ๋ถ๋ถ์ ์ผ๋ก๋ง ์ ๋ก๋๋จ.UPLOAD_ERR_NO_FILE(4): ํ์ผ์ด ์ ๋ก๋๋์ง ์์.UPLOAD_ERR_NO_TMP_DIR(6): ์์ ๋๋ ํฐ๋ฆฌ๊ฐ ์์.UPLOAD_ERR_CANT_WRITE(7): ํ์ผ ์ฐ๊ธฐ ์คํจ.UPLOAD_ERR_EXTENSION(8): PHP ํ์ฅ ๊ธฐ๋ฅ์ ์ํด ์ ๋ก๋ ์ค์ง๋จ.
size: ์ ๋ก๋๋ #ํ์ผ์_ํฌ๊ธฐ๋ฅผ #๋ฐ์ดํธ(Byte) ๋จ์๋ก ๋ํ๋ ๋๋ค.์์:
102400(100KB)
2. $_FILES ๋ณ์ ํ์ฉ ์์
์ง๋ ์๊ฐ์ ์์ฑํ๋ #HTML #ํผ (upload_form.html)์์ name="my_file"๋ก ํ์ผ์ ์
๋ก๋ํ์ ๋, $_FILES ๋ณ์๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค.
PHP
<?php
// upload_process.php
if (isset($_FILES['my_file'])) {
    echo "<pre>";
    print_r($_FILES['my_file']);
    echo "</pre>";
} else {
    echo "ํ์ผ์ด ์
๋ก๋๋์ง ์์์ต๋๋ค.";
}
/*
์ print_r($_FILES['my_file'])์ ์ถ๋ ฅ ์์:
Array
(
    [name] => example.jpg
    [type] => image/jpeg
    [tmp_name] => /tmp/phpABCD12
    [error] => 0
    [size] => 123456
)
*/
?>
3. $_FILES๋ฅผ ์ด์ฉํ ํ์ผ ์ ๋ก๋ ์ฒ๋ฆฌ ๋ก์ง (์ฌํ)
์ด์  $_FILES ๋ณ์์ ๊ฐ ์์๋ฅผ ํ์ฉํ์ฌ ์ค์  #ํ์ผ_์
๋ก๋_์ฒ๋ฆฌ_์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ๊ณผ์ ์์ #๋ณด์_๊ฒ์ฌ๊ฐ_๋งค์ฐ_์ค์ํฉ๋๋ค.
PHP
<?php
// upload_process.php
// 1. ์
๋ก๋ ๋๋ ํ ๋ฆฌ ์ค์  (๋ณด์์ ์น ์ ๊ทผ ๋ถ๊ฐํ ์์ ๊ฒฝ๋ก ๊ถ์ฅ)
$upload_dir = './uploads/'; // ํ์ฌ ์คํฌ๋ฆฝํธ ๊ธฐ์ค 'uploads' ํด๋
// ํด๋๊ฐ ์์ผ๋ฉด ์์ฑ (๊ถํ 0755)
if (!is_dir($upload_dir)) {
    mkdir($upload_dir, 0755, true);
}
// 2. ํ์ผ ์
๋ก๋ ์ค๋ฅ ํ์ธ (ํ์)
if (!isset($_FILES['my_file']) || $_FILES['my_file']['error'] !== UPLOAD_ERR_OK) {
    switch ($_FILES['my_file']['error']) {
        case UPLOAD_ERR_INI_SIZE:
        case UPLOAD_ERR_FORM_SIZE:
            echo "์ค๋ฅ: ์
๋ก๋ ํ์ผ ํฌ๊ธฐ๊ฐ ํ์ฉ๋ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ์ต๋๋ค.";
            break;
        case UPLOAD_ERR_NO_FILE:
            echo "์ค๋ฅ: ํ์ผ์ด ์ ํ๋์ง ์์์ต๋๋ค.";
            break;
        default:
            echo "์ค๋ฅ: ํ์ผ ์
๋ก๋ ์ค ์ ์ ์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ฝ๋: " . $_FILES['my_file']['error'];
            break;
    }
    exit;
}
// 3. ์
๋ก๋๋ ํ์ผ ์ ๋ณด ๋ณ์์ ์ ์ฅ
$file_name_original = $_FILES['my_file']['name'];
$file_tmp_name = $_FILES['my_file']['tmp_name'];
$file_type = $_FILES['my_file']['type'];
$file_size = $_FILES['my_file']['size'];
// 4. ์๊ฒฉํ ๋ณด์ ๊ฒ์ฌ (๋งค์ฐ ์ค์!)
// 4-1. ํ์ผ ํฌ๊ธฐ ์ ํ (์: 2MB)
$max_file_size = 2 * 1024 * 1024; // 2MB
if ($file_size > $max_file_size) {
    echo "์ค๋ฅ: ํ์ผ ํฌ๊ธฐ๊ฐ ๋๋ฌด ํฝ๋๋ค. (์ต๋ 2MB)";
    exit;
}
// 4-2. ํ์ฉ๋ ํ์ฅ์์ MIME ํ์
 ๊ฒ์ฌ
$allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'pdf'];
$allowed_mime_types = ['image/jpeg', 'image/png', 'image/gif', 'application/pdf'];
// ํ์ฅ์ ์ถ์ถ (์๋ฌธ์๋ก ๋ณํ)
$file_ext = strtolower(pathinfo($file_name_original, PATHINFO_EXTENSION));
// MIME ํ์
 ํ์ธ ($_FILES['type']์ ํด๋ผ์ด์ธํธ์์ ์ ์กํ๋ฏ๋ก ์ฐธ๊ณ ์ฉ)
// ๋ ์์ ํ ๋ฐฉ๋ฒ์ ์ค์  ํ์ผ์ MIME ํ์
์ ์๋ฒ์์ ์ฌํ์ธํ๋ ๊ฒ (์: finfo_open())
if (!in_array($file_ext, $allowed_extensions)) {
    echo "์ค๋ฅ: ํ์ฉ๋์ง ์๋ ํ์ผ ํ์ฅ์์
๋๋ค. (ํ์ฉ: " . implode(', ', $allowed_extensions) . ")";
    exit;
}
if (!in_array($file_type, $allowed_mime_types)) { // 1์ฐจ์ ์ธ MIME ํ์
 ๊ฒ์ฌ
    echo "์ค๋ฅ: ํ์ฉ๋์ง ์๋ ํ์ผ MIME ํ์
์
๋๋ค. (ํ์ฉ: " . implode(', ', $allowed_mime_types) . ")";
    exit;
}
// 5. ํ์ผ ์ด๋ฆ ๋ณ๊ฒฝ (๋ณด์์ ํ์: ์๋ณธ ์ด๋ฆ์ ๊ทธ๋๋ก ์ฌ์ฉํ์ง ๋ง์ธ์!)
// ์ ๋ํฌํ ํ์ผ ์ด๋ฆ ์์ฑ (๊ฒน์น์ง ์๊ฒ, ์ถ์ธก ๋ถ๊ฐ๋ฅํ๊ฒ)
$new_file_name = uniqid('upload_') . '.' . $file_ext;
$destination = $upload_dir . $new_file_name; // ์ต์ข
 ์ ์ฅ ๊ฒฝ๋ก
// 6. ์์ ํ์ผ์ ์๊ตฌ ์ ์ฅ์๋ก ์ด๋
// move_uploaded_file() ํจ์๋ ์์ ๋๋ ํ ๋ฆฌ์ ์๋ ์
๋ก๋๋ ํ์ผ์ ์์ ํ๊ฒ ์ง์ ๋ ๋ชฉ์ ์ง๋ก ์ด๋์ํต๋๋ค.
// ์ด ํจ์๋ ์์ ํ์ผ ์ฌ๋ถ์ ๊ถํ ๋ฑ์ ๋ด๋ถ์ ์ผ๋ก ํ์ธํ์ฌ ๋ณด์์ ์์ ํฉ๋๋ค.
if (move_uploaded_file($file_tmp_name, $destination)) {
    echo "ํ์ผ์ด ์ฑ๊ณต์ ์ผ๋ก ์
๋ก๋๋์์ต๋๋ค.n";
    echo "์ ์ฅ๋ ํ์ผ๋ช
: " . htmlspecialchars($new_file_name) . "n";
    echo "ํ์ผ ๊ฒฝ๋ก: " . htmlspecialchars($destination) . "n";
    // ์ด๋ฏธ์ง๊ฐ ์น์์ ์ ๊ทผ ๊ฐ๋ฅํ๊ณ  ์ด๋ฏธ์ง์ธ ๊ฒฝ์ฐ์๋ง ํ์
    if (strpos($file_type, 'image/') === 0) {
        echo "<img src='" . htmlspecialchars($destination) . "' alt='์
๋ก๋๋ ์ด๋ฏธ์ง' style='max-width:400px; height:auto; display:block; margin-top:20px;'>n";
    }
} else {
    echo "์ค๋ฅ: ํ์ผ ์
๋ก๋์ ์คํจํ์ต๋๋ค. (์ด๋ ์คํจ)";
}
?>
4. ๋ค์ค ํ์ผ ์ ๋ก๋ ์ฒ๋ฆฌ
HTML ํผ์์ <input type="file" name="my_files[]" multiple>๊ณผ ๊ฐ์ด #name ์์ฑ์ #๋ฐฐ์ด_ํ์([])์ ์ถ๊ฐํ๋ฉด ์ฌ๋ฌ ํ์ผ์ ๋์์ ์
๋ก๋ํ  ์ ์์ต๋๋ค. ์ด๋ $_FILES ๋ฐฐ์ด์ ๊ตฌ์กฐ๋ ์ฝ๊ฐ ๋ฌ๋ผ์ง๋๋ค.
HTML (upload_form_multiple.html)
HTML
<form action="upload_process_multiple.php" method="POST" enctype="multipart/form-data">
    <label for="my_files">์ฌ๋ฌ ํ์ผ ์ ํ:</label>
    <input type="file" name="my_files[]" id="my_files" multiple required>
    <input type="submit" value="ํ์ผ ์
๋ก๋">
</form>
PHP (์์: upload_process_multiple.php)
PHP
<?php
// upload_process_multiple.php
// $_FILES['my_files'] ๋ฐฐ์ด ๊ตฌ์กฐ:
/*
Array
(
    [name] => Array
        (
            [0] => file1.jpg
            [1] => file2.png
        )
    [type] => Array
        (
            [0] => image/jpeg
            [1] => image/png
        )
    ...
)
*/
if (isset($_FILES['my_files'])) {
    $total_files = count($_FILES['my_files']['name']);
    echo "์ด " . $total_files . "๊ฐ์ ํ์ผ์ด ์
๋ก๋ ์๋๋์์ต๋๋ค.nn";
    for ($i = 0; $i < $total_files; $i++) {
        // ๊ฐ ํ์ผ์ ์ ๋ณด ์ถ์ถ
        $file_name_original = $_FILES['my_files']['name'][$i];
        $file_tmp_name = $_FILES['my_files']['tmp_name'][$i];
        $file_error = $_FILES['my_files']['error'][$i];
        $file_size = $_FILES['my_files']['size'][$i];
        $file_type = $_FILES['my_files']['type'][$i];
        echo "--- ํ์ผ " . ($i + 1) . ": " . htmlspecialchars($file_name_original) . " ---n";
        if ($file_error !== UPLOAD_ERR_OK) {
            echo "์ค๋ฅ ๋ฐ์: " . $file_error . "n";
            continue; // ๋ค์ ํ์ผ๋ก ๋์ด๊ฐ
        }
        // ๋ณด์ ๊ฒ์ฌ ๋ฐ ํ์ผ ์ด๋ ๋ก์ง์ ๋จ์ผ ํ์ผ๊ณผ ๋์ผํ๊ฒ ์ ์ฉ
        // (์์ ๋จ์ผ ํ์ผ ์ฒ๋ฆฌ ๋ก์ง์ ์ด ๋ฐ๋ณต๋ฌธ ์์ ๋ฃ์ผ๋ฉด ๋จ)
        // ์ฌ๊ธฐ์๋ ๊ฐ๋จํ ์ด๋๋ง ์์
        $upload_dir = './uploads/';
        if (!is_dir($upload_dir)) { mkdir($upload_dir, 0755, true); }
        $file_ext = strtolower(pathinfo($file_name_original, PATHINFO_EXTENSION));
        $new_file_name = uniqid('multi_') . '.' . $file_ext;
        $destination = $upload_dir . $new_file_name;
        if (move_uploaded_file($file_tmp_name, $destination)) {
            echo "์ฑ๊ณต: " . htmlspecialchars($new_file_name) . " ๋ก ์ ์ฅ๋์์ต๋๋ค.n";
        } else {
            echo "์คํจ: ํ์ผ์ ์ด๋ํ  ์ ์์ต๋๋ค.n";
        }
        echo "n";
    }
} else {
    echo "์
๋ก๋๋ ํ์ผ์ด ์์ต๋๋ค.";
}
?>
#$_FILES ์ํผ ๊ธ๋ก๋ฒ ๋ณ์๋ #PHP์์ #ํ์ผ_์
๋ก๋๋ฅผ ๋ค๋ฃจ๋ ๋ฐ ์์ด ํต์ฌ์ ์ธ ์ญํ ์ ํฉ๋๋ค. name, type, tmp_name, error, size ๋ฑ์ ์ ๋ณด๋ฅผ ํตํด ์
๋ก๋๋ ํ์ผ์ #์์ ํ๊ฒ_์ฒ๋ฆฌํ๊ณ  #์ ์ฅํ _์_์์ต๋๋ค. ํนํ #๋ณด์_์ทจ์ฝ์ ์_๋ง๊ธฐ_์ํด #ํ์ผ_์ด๋ฆ_๋ณ๊ฒฝ, #ํ์ฅ์_๋ฐ_MIME_ํ์
_๊ฒ์ฌ, #ํ์ผ_ํฌ๊ธฐ_์ ํ ๋ฑ์ #๋ณด์_๋ก์ง์_๋ฐ๋์_์ ์ฉํด์ผ_ํ๋ค๋_์ _์์ง_๋ง์ธ์! ๋ค์ ์๊ฐ์๋ ์
๋ก๋๋ #์ด๋ฏธ์ง๋ฅผ_๋ค๋ฃจ๋_๋ฐฉ๋ฒ์ ๋ํด ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.