반응형
Web Development · PHP 파일 경로 함수
PHP pathinfo() — 파일 경로를 분해하는 함수
dirname · basename · extension · filename · __FILE__ 매직 상수 완전 정리
시작 오늘 분석할 코드
pathinfo()는 파일 경로 문자열을 dirname(디렉토리), basename(파일명+확장자), extension(확장자), filename(확장자 제외 파일명) 4가지로 분해해 반환하는 함수입니다. 두 번째 인수로 원하는 항목 하나만 지정할 수도 있습니다. __FILE__은 현재 파일의 절대 경로를 담은 PHP 매직 상수입니다.
<?php $info = pathinfo(__FILE__); // __FILE__ = 현재 실행 중인 파일의 절대 경로 // 예: /var/www/html/test.php print_r($info); // Array // ( // [dirname] => /var/www/html // [basename] => test.php // [extension] => php // [filename] => test // ) ?>
실제 출력 미리보기
pathinfo("/var/www/html/photo.jpg") 분해 결과
dirname
/var/www/html
basename
photo.jpg
extension
jpg
filename
photo
용어 용어 정리
pathinfo()경로 문자열을 dirname/basename/extension/filename 배열로 분해
dirname파일이 속한 디렉토리 경로 — "/var/www/html"
basename디렉토리를 제외한 파일명 — "photo.jpg"
extension확장자(점 제외) — "jpg"
filename확장자 없는 파일명 — "photo". PHP 5.2.0+
__FILE__현재 파일의 절대 경로 매직 상수. 동적으로 변하지 않음
PATHINFO_상수두 번째 인수 — PATHINFO_DIRNAME/BASENAME/EXTENSION/FILENAME
basename() 함수pathinfo의 basename만 추출하는 독립 함수 — 두 번째 인수로 접미사 제거 가능
1 두 번째 인수 — 원하는 키 하나만 가져오기
PATHINFO_상수로 단일 값 추출
두 번째 인수 없이 호출하면 배열을 반환합니다. PATHINFO_EXTENSION 처럼 상수를 넣으면 해당 값만 문자열로 반환합니다. 확장자 검사 등 특정 항목만 필요할 때 자주 사용합니다.
$path = "/var/www/uploads/photo.jpg"; // 전체 배열 $info = pathinfo($path); echo $info['extension']; // jpg // 원하는 키만 바로 추출 echo pathinfo($path, PATHINFO_EXTENSION); // jpg echo pathinfo($path, PATHINFO_FILENAME); // photo echo pathinfo($path, PATHINFO_DIRNAME); // /var/www/uploads echo pathinfo($path, PATHINFO_BASENAME); // photo.jpg
2 업로드 파일 확장자 검사
extension으로 허용 파일 형식 체크
$allowed = ['jpg', 'jpeg', 'png', 'gif']; $filename = $_FILES['upload']['name']; $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); if (!in_array($ext, $allowed)) { die("허용되지 않은 파일 형식: {$ext}"); }
⚠️ 확장자 검사만으로는 보안이 충분하지 않습니다. photo.php.jpg 처럼 위장할 수 있으므로, MIME 타입 검사(finfo_file)도 함께 사용하는 것이 권장됩니다.
3 __FILE__과 활용 패턴
현재 파일 경로 기반으로 상대 경로 구성
// __FILE__: 현재 파일의 절대 경로 echo __FILE__; // /var/www/html/includes/util.php // 현재 파일의 디렉토리 기준으로 설정 파일 로드 $base = pathinfo(__FILE__, PATHINFO_DIRNAME); // 또는 dirname(__FILE__) 과 동일 require $base . '/config.php'; require $base . '/../db.php';
※ PHP 5.3+에서는
__DIR__ 매직 상수가 pathinfo(__FILE__, PATHINFO_DIRNAME)과 동일한 역할을 합니다. 현대 PHP에서는 __DIR__을 더 많이 씁니다.
반응형
4 확장자 변경 — 동일한 파일명에 다른 확장자
파일 변환 시 결과물 경로 구성
$original = "uploads/photo.png"; $dir = pathinfo($original, PATHINFO_DIRNAME); $name = pathinfo($original, PATHINFO_FILENAME); $converted = $dir . '/' . $name . '.jpg'; // → "uploads/photo.jpg" echo "변환 결과 경로: {$converted}";
5 basename() 독립 함수 — 접미사 제거 기능
basename($path, $suffix) — 특정 접미사를 제거한 파일명 추출
// basename() — 단독 함수 echo basename("/var/www/html/photo.jpg"); // photo.jpg // 두 번째 인수로 제거할 접미사 지정 echo basename("/var/www/html/photo.jpg", ".jpg"); // photo (확장자 제거) // dirname() 단독 함수 echo dirname("/var/www/html/photo.jpg"); // /var/www/html
6 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
| 확장자 검사 시 대소문자 미통일 | Photo.JPG가 허용 목록 in_array 통과 못 함 | strtolower(pathinfo($f, PATHINFO_EXTENSION)) |
| 확장자 없는 파일에서 extension 없음 | 배열에 extension 키 자체가 없음 | $info['extension'] ?? '' 로 기본값 처리 |
| 확장자 검사만으로 업로드 허용 | fake.php.jpg 같은 위장 파일 업로드 가능 | MIME 타입(finfo_file) 병행 검사 |
| __FILE__ 대신 SCRIPT_FILENAME 사용 | 포함(include)된 파일에서 경로가 달라짐 | __FILE__은 항상 해당 파일 자신의 경로 |
| dirname()과 PATHINFO_DIRNAME 혼용 혼란 | pathinfo($p, PATHINFO_DIRNAME) = dirname($p) — 동일 | 단순 디렉토리 추출은 dirname() 단독 사용도 가능 |
핵심 한 줄 요약
pathinfo($path)경로 분해 → dirname / basename / extension / filename 배열
PATHINFO_EXTENSION두 번째 인수로 특정 키만 추출 — 가장 자주 쓰는 패턴
__FILE__현재 파일 절대 경로 매직 상수 — pathinfo(__FILE__) 로 분해
현대 PHPdirname() 단독, __DIR__ 상수가 많이 쓰임 — pathinfo와 동일
보안확장자 검사만으론 부족 — MIME 타입 병행 검사 권장
Tags
#PHP #pathinfo #경로정보 #dirname #basename #extension #__FILE__ #PHP파일함수 #PHP함수 #PHP학습 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, pathinfo, 경로정보, dirname, basename, extension, filename, __FILE__, PHP파일함수, PHP함수, PHP학습, 웹개발, 티스토리
반응형
'php' 카테고리의 다른 글
| PHP header(Location) — 페이지 리다이렉션 · exit 필수 · 301/302 완전 정리 (0) | 2026.07.11 |
|---|---|
| PHP mb_convert_encoding() — 인코딩 변환 · UTF-8 · EUC-KR 완전 정리 (0) | 2026.07.11 |
| PHP rmdir() — 빈 폴더 삭제 · is_dir 체크 · 재귀 삭제 완전 정리 (0) | 2026.07.11 |
| PHP mkdir() — 폴더(디렉토리) 생성 · is_dir 체크 · 재귀 생성 완전 정리 (0) | 2026.07.11 |
| PHP unlink() — 파일 삭제 · is_file 체크 · 임시파일 처리 완전 정리 (0) | 2026.07.11 |
왕진 블로그

댓글