파일 업로드를 위해서는 다음과 같은 필수 조건이 있습니다:
form 태그에 enctype="multipart/form-data" 지정
method="post" 사용
input type="file" 포함
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="myfile">
<input type="submit" value="업로드">
</form>
업로드된 파일은 PHP에서 $_FILES 배열을 통해 접근할 수 있습니다.
if (isset($_FILES['myfile'])) {
$file = $_FILES['myfile'];
if ($file['error'] === UPLOAD_ERR_OK) {
$tmpName = $file['tmp_name']; // 임시 저장 위치
$name = basename($file['name']); // 원본 파일 이름
$uploadDir = "uploads/";
$uploadFile = $uploadDir . $name;
if (move_uploaded_file($tmpName, $uploadFile)) {
echo "파일 업로드 성공: $uploadFile";
} else {
echo "파일 업로드 실패";
}
} else {
echo "에러 코드: " . $file['error'];
}
}
$_FILES['myfile'] = [
'name' => '파일명.jpg',
'type' => 'image/jpeg',
'tmp_name' => '/tmp/phpYzdqkD',
'error' => 0,
'size' => 123456
];
키 |
설명 |
---|---|
name |
사용자가 업로드한 파일의 원래 이름 |
type |
MIME 타입 |
tmp_name |
서버에 저장된 임시 파일 경로 |
error |
업로드 상태 코드 |
size |
바이트 단위 파일 크기 |
코드 |
설명 |
---|---|
0 |
정상 업로드 |
1 |
php.ini의 upload_max_filesize 초과 |
2 |
HTML 폼에서 설정된 MAX_FILE_SIZE 초과 |
3 |
파일이 일부만 업로드됨 |
4 |
파일이 업로드되지 않음 |
6 |
임시 폴더 없음 |
7 |
디스크에 쓰기 실패 |
8 |
확장에 의해 업로드 중단 |
file_uploads = On
upload_max_filesize = 5M
post_max_size = 8M
max_file_uploads = 10
업로드 최대 용량은 post_max_size보다 upload_max_filesize가 작아야 합니다.
$allowedTypes = ['image/jpeg', 'image/png', 'application/pdf'];
$maxSize = 2 * 1024 * 1024; // 2MB
if (!in_array($file['type'], $allowedTypes)) {
echo "허용되지 않은 파일 형식";
} elseif ($file['size'] > $maxSize) {
echo "파일 크기가 너무 큽니다";
} else {
move_uploaded_file($file['tmp_name'], "uploads/" . basename($file['name']));
}
파일 이름 검증: basename()이나 고유한 이름 사용 (uniqid() 등)
확장자 검사: MIME 타입과 파일 확장자 모두 확인
디렉토리 경로 고정: 사용자가 경로를 조작할 수 없도록 하드코딩
임시 파일은 반드시 move_uploaded_file() 사용: 임의 이동 방지
실행 가능한 파일 제한: .php, .exe, .sh 등의 업로드 방지
$ext = pathinfo($file['name'], PATHINFO_EXTENSION);
$newName = uniqid('upload_', true) . '.' . $ext;
move_uploaded_file($file['tmp_name'], "uploads/" . $newName);
HTML:
<input type="file" name="myfiles[]" multiple>
PHP:
foreach ($_FILES['myfiles']['name'] as $i => $name) {
$tmp = $_FILES['myfiles']['tmp_name'][$i];
move_uploaded_file($tmp, "uploads/" . basename($name));
}
$dir = "uploads/";
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
}
작업 |
관련 함수/항목 |
---|---|
HTML 폼 구성 |
<form enctype="multipart/form-data"> |
파일 정보 확인 |
$_FILES 배열 |
파일 이동 |
move_uploaded_file() |
파일 검증 |
type, size, extension 검사 |
에러 처리 |
$_FILES['error'] 코드 확인 |
보안 조치 |
확장자 제한, 고유 파일명 사용 등 |