학습
PHP 파일 업로드 처리
PHP 파일 업로드 처리 — 중급
PHP 파일 업로드 처리
1. 도입 (왜 배워야 하는가)
파일 업로드는 웹 애플리케이션에서 매우 중요한 기능입니다. 사용자들이 이미지, 문서, 비디오 등을 서버에 업로드할 수 있도록 해주며, 이 기능은 쇼핑몰, 소셜 미디어, 클라우드 서비스 등 다양한 웹 서비스에서 필수적입니다.
이 기능을 모르면 사용자가 파일을 서버에 전송할 수 없으므로, 사용자 경험이 저하되고 애플리케이션의 기능이 제한됩니다. 예를 들어, 사용자가 프로필 사진을 업로드할 수 없다면 서비스의 매력도가 떨어질 수 있습니다. 따라서 PHP에서 파일 업로드를 처리하는 방법을 이해하고 구현하는 것은 매우 중요합니다.
2. 핵심 개념 설명
- POST 요청: 웹에서 파일을 업로드할 때 주로 사용되는 방법입니다. 사용자가 정보를 제출할 때, 이 정보를 서버로 전송하기 위해 POST 방식이 사용됩니다.
- $_FILES 배열: PHP에서 파일 업로드 시, 업로드된 파일에 대한 정보를 담고 있는 슈퍼글로벌 배열입니다. 이 배열에는 파일의 이름, 타입, 임시 경로, 오류 코드 등이 포함되어 있습니다.
- 파일 타입 검사: 업로드된 파일이 예상한 형식인지 확인하는 과정입니다. 예를 들어, 이미지 파일만 허용하고 싶은 경우, MIME 타입을 검사하여 안전성을 확보합니다.
| 용어 | 설명 |
|---|---|
| POST 요청 | 사용자가 데이터를 서버에 전송하는 방식 |
| $_FILES 배열 | 업로드된 파일 정보를 담고 있는 배열 |
| MIME 타입 | 파일 형식을 나타내는 식별자 |
3. 기본 코드 예제
아래는 파일 업로드를 처리하는 가장 기본적인 PHP 코드 예제입니다.
<?php
if ($_SERVER['REQUEST_METHOD'] 'POST') {
if (isset($_FILES['uploaded_file'])) {
$file = $_FILES['uploaded_file'];
// 파일이 정상적으로 업로드되었는지 확인
if ($file['error'] = UPLOAD_ERR_OK) {
$upload_dir = 'uploads/';
$upload_file = $upload_dir . basename($file['name']);
// 파일을 지정한 디렉토리로 이동
if (move_uploaded_file($file['tmp_name'], $upload_file)) {
echo "파일이 성공적으로 업로드되었습니다.";
} else {
echo "파일 업로드에 실패했습니다.";
}
} else {
echo "파일 업로드 중 오류가 발생했습니다.";
}
}
}
?>
<form method="POST" enctype="multipart/form-data">
<input type="file" name="uploaded_file" />
<input type="submit" value="업로드" />
</form>
- if ($_SERVER['REQUEST_METHOD'] == 'POST'): 요청 방식이 POST인지 확인합니다.
- if (isset($_FILES['uploaded_file'])): 업로드된 파일이 존재하는지 확인합니다.
- $file = $_FILES['uploaded_file'];: 업로드된 파일 정보를 $_FILES 배열에서 가져옵니다.
- if ($file['error'] === UPLOAD_ERR_OK): 파일 업로드에 오류가 없음을 확인합니다.
- move_uploaded_file(...): 임시 위치에서 최종 위치로 파일을 이동합니다.
4. 실전 활용 예제
- 쇼핑몰에서 상품 이미지 업로드
- 프로필 사진 변경
- 파일 크기 제한을 설정하지 않음
- 파일 타입 검사를 하지 않음
- 업로드 경로를 하드코딩
- 파일 업로드는 웹 애플리케이션의 필수 기능입니다.
- POST 요청과 $_FILES 배열을 이용하여 파일을 처리합니다.
- 파일 타입과 크기 검사는 보안상 매우 중요합니다.
- 다음에 학습하면 좋은 주제: 파일 업로드 시 보안 강화 방법 (예: 파일 이름 변환, 폴더 권한 설정 등).
- 사용자가 상품을 등록할 때, 상품 이미지를 업로드할 수 있습니다. 이 경우 파일 타입을 검사하여 이미지 파일만 허용하도록 합니다.
$allowed_types = ['image/jpeg', 'image/png'];
if (!in_array($file['type'], $allowed_types)) {
echo "허용되지 않는 파일 형식입니다.";
}
- 사용자가 자신의 프로필 사진을 업로드할 수 있도록 구현합니다. 업로드된 파일의 크기를 제한하여 서버 용량을 관리할 수 있습니다.
if ($file['size'] > 2000000) { // 2MB
echo "파일 크기가 너무 큽니다.";
}
5. 흔한 실수와 주의사항
- 잘못된 코드: 파일 크기를 제한하지 않으면 대용량 파일로 인해 서버가 다운될 수 있습니다.
- 올바른 코드: php.ini에서 upload_max_filesize를 설정하거나 코드에서 파일 크기를 체크합니다.
- 잘못된 코드: 사용자가 악성 파일을 업로드할 수 있습니다. - 올바른 코드: MIME 타입을 검사하여 안전한 파일만 허용합니다.
- 잘못된 코드: 절대 경로를 사용하면 이식성이 떨어집니다.
- 올바른 코드: __DIR__ 상수를 사용하여 현재 디렉토리에 상대적으로 경로를 설정합니다.