IT
PHP 파일 업로드
1. HTML 폼 준비
파일 업로드를 위해서는 다음과 같은 필수 조건이 있습니다:
-
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>
2. PHP 업로드 처리 (upload.php)
업로드된 파일은 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'];
}
}
3. $_FILES 배열 구조
$_FILES['myfile'] = [
'name' => '파일명.jpg',
'type' => 'image/jpeg',
'tmp_name' => '/tmp/phpYzdqkD',
'error' => 0,
'size' => 123456
];
키
설명
name
사용자가 업로드한 파일의 원래 이름
type
MIME 타입
tmp_name
서버에 저장된 임시 파일 경로
error
업로드 상태 코드
size
바이트 단위 파일 크기
4. 업로드 오류 코드 ($_FILES['myfile']['error'])
코드
설명
0
정상 업로드
1
php.ini의 upload_max_filesize 초과
2
HTML 폼에서 설정된 MAX_FILE_SIZE 초과
3
파일이 일부만 업로드됨
4
파일이 업로드되지 않음
6
임시 폴더 없음
7
디스크에 쓰기 실패
8
확장에 의해 업로드 중단
5. 업로드 파일 제한 설정 (php.ini)
file_uploads = On
upload_max_filesize = 5M
post_max_size = 8M
max_file_uploads = 10
-
업로드 최대 용량은 post_max_size보다 upload_max_filesize가 작아야 합니다.
6. 파일 유효성 검사 예
$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']));
}
7. 보안 고려 사항
-
파일 이름 검증: basename()이나 고유한 이름 사용 (uniqid() 등)
-
확장자 검사: MIME 타입과 파일 확장자 모두 확인
-
디렉토리 경로 고정: 사용자가 경로를 조작할 수 없도록 하드코딩
-
임시 파일은 반드시 move_uploaded_file() 사용: 임의 이동 방지
-
실행 가능한 파일 제한: .php, .exe, .sh 등의 업로드 방지
8. 업로드 파일명 변경 예
$ext = pathinfo($file['name'], PATHINFO_EXTENSION);
$newName = uniqid('upload_', true) . '.' . $ext;
move_uploaded_file($file['tmp_name'], "uploads/" . $newName);
9. 여러 파일 업로드
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));
}
10. 디렉토리 존재 확인 및 생성
$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'] 코드 확인
보안 조치
확장자 제한, 고유 파일명 사용 등
댓글
아직 댓글이 없습니다.
로그인 후 댓글을 남길 수 있습니다.