PHP 파일 업로드가 move_uploaded_file 함수에서 실패하는 경우
개발에서 어려운 부분을 꼽으라면 “프로젝트마다 한 번만 설정하는 것들”을 빼먹을 수 없다.
예컨대 리눅스에 APM 세팅하기, 이클립스에서 Autocomplete 세팅하기, SSL 설치 같은 것인데 막상 매뉴얼을 보면서 차근차근 따라하면 별 것 아닌 문제도 한참 시간이 지나서 다시 하려고 하면 버벅거리는 일이 많다.
PHP 파일 업로드 같은 것을 생각해보면, ini 파일부터 시작해서 의외로 손 대야 할 곳이 많기 때문에 업로드가 동작 안 할 경우에 골치아픈 확인작업을 거쳐야 한다.
특히 “예전에 만들어 놓은 코드를 재사용 해 볼까?”같은 시나리오에서 엉뚱한 실수를 하는 일이 많다. 코드가 같다고 결과가 같지 않은 것이 환경설정의 마법이다.
PHP 파일 업로드에 관한 튜토리얼을 찾으면 대부분 이런 느낌의 튜토리얼이 검색되는데, 코드를 그대로 갖다 쓸 경우에 높은 확률로 move_uploaded_file 함수가 false를 리턴한다.
잔뼈가 굵은 개발자들은 바로 감이 오겠지만 move_uploaded_file 의 두 번째 인자로 파일이 복사될 위치를 지정하게 되는데, 해당 위치에 대한 쓰기 권한을 똑바로 설정하지 않아서 그런 경우가 대부분이다.
특히 대부분 리눅스 웹서버 세팅에서는 쓰기 권한이 필요한 경우에도 디렉토리 권한을 755로 설정하라는 안내가 많기 때문에 move_uploaded_file 함수가 이미지 파일을 옮길 수가 없게 된다.
757로 설정하고 나면 업로드가 잘 된다.
단, 디렉토리에 익명 쓰기 권한을 주고 나면 반드시 확장자 체크 등을 통해서 악성 파일이 업로드되는 것을 막아야 하고 가급적이면 익명 쓰기 권한을 주는 폴더를 최소화해야 한다.
PHP외에도 윈도우즈7 이상부터 파일 쓰기 권한 때문에 문제가 생기는 경우가 은근히 많은데(설치형 게임에서 세이브가 안 된다거나) 저 발상을 떠올리지 못하면 애꿎은 코드만 한참 들볶게 되니 주의해야겠다.