
PHP ๊ฐ์
>PHP - ์ค๊ธ
๐ PHP ์ค๊ธ - 4์ฃผ์ฐจ: ํ์ผ ์ ๋ก๋ ๋ฐ ์ด๋ฏธ์ง ์ฒ๋ฆฌ - 02 $_FILES ์ํผ ๊ธ๋ก๋ฒ ๋ณ์
![]() |
ํ์ | 10.0 | ๋ผ์ด์ผ์ค | free |
---|---|---|---|---|
์ฌ์ฉ์ํ์ | 10.0 | ์ด์์ฒด์ | ||
๋ค์ด๋ก๋ | 1 | ํ์ผํฌ๊ธฐ | 0 | |
์ ์์ฌ | LUZENSOFT | ๋ฑ๋ก์ผ | 2025-07-25 09:38:57 | |
์กฐํ์ | 10 |
๐ 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_ํ์
_๊ฒ์ฌ, #ํ์ผ_ํฌ๊ธฐ_์ ํ ๋ฑ์ #๋ณด์_๋ก์ง์_๋ฐ๋์_์ ์ฉํด์ผ_ํ๋ค๋_์ _์์ง_๋ง์ธ์! ๋ค์ ์๊ฐ์๋ ์
๋ก๋๋ #์ด๋ฏธ์ง๋ฅผ_๋ค๋ฃจ๋_๋ฐฉ๋ฒ์ ๋ํด ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.