move_uploaded_file() 함수는 HTTP POST 방식으로 업로드된 파일을 지정한 새 위치로 이동하는 PHP 내장 함수입니다. 만약 이동하려는 위치에 동일한 이름의 파일이 이미 존재한다면, 기존 파일은 자동으로 덮어써집니다.
이 함수는 내부적으로 해당 파일이 실제로 유효한 업로드 파일인지(is_uploaded_file() 검사) 확인해 주기 때문에, 단순히 copy()나 rename()을 사용하는 것보다 보안 측면에서 훨씬 안전합니다.
문법(Syntax)
move_uploaded_file(file_path, moved_path)
매개변수(Parameters)
file_path − 이동할 업로드 파일의 경로입니다. 일반적으로
$_FILES['파일명']['tmp_name']형태로 임시 저장된 파일 경로를 전달합니다.moved_path − 파일이 이동될 목적지 경로입니다. 디렉터리 경로뿐만 아니라 저장할 파일 이름까지 포함하는 것이 좋습니다.
반환값(Return)
move_uploaded_file() 함수는 파일 이동에 성공하면 true를, 실패하면 false를 반환합니다. 실패 원인으로는 파일이 유효한 업로드 파일이 아니거나, 목적지 디렉터리에 쓰기 권한이 없는 경우 등이 있습니다.
예제(Example)
<?php
if (move_uploaded_file($_FILES['userfile']['tmp_name'], "/documents/new/")) {
print "Uploaded successfully!";
} else {
print "Upload failed!";
}
?>
출력(Output)
Upload failed!PHP Notice: Undefined index: userfile in /home/cg/root/8944881/main.php on line 2
출력 결과 분석
위 예제에서 "Upload failed!"가 출력된 이유는 $_FILES['userfile'] 인덱스가 정의되어 있지 않기 때문입니다. 즉, 실제로 파일이 업로드되지 않은 상태에서 함수가 호출되었으므로 false가 반환되고, PHP는 "Undefined index" 공지(Notice)를 발생시킵니다.
참고 사항
업로드 처리 시에는 반드시
<form>태그에enctype="multipart/form-data"속성을 설정해야$_FILES배열에 값이 담깁니다.목적지 경로 끝에 슬래시(/)만 지정하면 의도대로 동작하지 않을 수 있으므로,
/documents/new/filename.jpg처럼 파일 이름까지 명시하는 것이 안전합니다.웹 서버 프로세스가 목적지 디렉터리에 대한 쓰기 권한을 가지고 있는지 사전에 확인해야 합니다.