바로 설명을 드리죠.
앞의 소스 코드와 비교해 가면서 보시는 게 좋습니다.

- $target_dir = “up”;
파일이 업로드될 디렉토리 이름을 $target_dir 변수에 저장을 합니다.
실제 서버에 up 이라는 디렉토리가 있어야 합니다. 만약에 리눅스 시스템이라면 모든 이용자가 디렉토리 내에 파일을 읽고 쓸 수 있도록 퍼미션을 777로 주어야 합니다.(어떻게 퍼미션 설정하는지는 본 강좌 주제와 다소 벗어나므로 생략합니다~~ ) - if(strcmp($upfile,”none”)) { // 파일이 업로드되었을 경우
upload.html에서 파일을 선택해서 [전송] 버튼을 눌렀는데, 정상적으로 업로드되지 않았거나 파일을 선택하지 않고 [전송] 버튼을 눌렀을 경우에는 “none”이라는 문자열을 보내게 됩니다.
위 조건문은 “none”이라는 문자열이 전송되어왔는지를 검사하는 문장입니다.strcmp 함수는 두 개의 문자열을 비교하는 함수입니다.
위에서는 $upfile의 값과 “none”이라는 문자열을 비교합니다. 이렇게 두 개의 문자열을 비교해서 같으면(참이면) 0을, 아니면 0이 아닌 값을 반환하는 기능을 합니다.
따라서 $upfile의 값이 “none”이면 strcmp($upfile,”none”)의 값이 0이 되므로 5행의 if 조건문은 거짓이 됩니다. (if나 while과 같은 조건문에서 0은 거짓을 나타냅니다. 반대로 0이 아닌 수는 참을 가리킵니다.) 조금 헤깔릴 수 있는 부분입니다.if(strcmp($upfile,”none”)) 문장은 이렇게 바꿀 수도 있습니다.
→ if($upfile != “none”)
반대로, if(!strcmp($upfile,”none”)) 은,
→ if($upfile == “none”) 와 같은 의미가 됩니다. - $filename = explode(“.”, $upfile_name);
- $extension = $filename[sizeof($filename)-1];
8행과 9행에서는 파일 전체 이름(확장자까지 포함한 이름)을 순수 파일 이름과 확장자로 분리하게 됩니다.
explode 함수는 특정 구분자를 기준으로 문자열을 나누어 배열에 저장하는 역할을 합니다.
예를 들어, $day = explode(“-“,”2002-12-25”) 이라고 하면,
$day[0] → “2002”
$day[1] → “12”
$day[2] → “25” 가 각각 저장됩니다.따라서 위 8행에서는, 점(.)을 기준으로 분리하는 것이기 때문에, 만약 파일 이름이 itmembers.jpg라고 한다면,
$filename[0] → “itmembers”
$filename[1] → “jpg” 가 각각 저장됩니다.8행에서 분리한 문자열 중 확장자만 따로 $extension 변수에 저장하는 것이 9행입니다.
확장자는 맨 마지막 배열에 들어 있겠죠? 위의 예에서는 $filename[1]에 들어 있을 겁니다.
9행을 보면 $filename 배열의 크기를 구하여 -1을 합니다. 위와 같은 경우라면 $filename의 크기는 2가 되겠죠.
$filename[0]과 $filename[1], 이렇게 두 개니까요.
이렇게 구한 2에서 1을 뺀 수를 배열 요소로 갖게 되면 결국 $filename[1] 이 되겠죠. 여기에 확장자를 저장하게 됩니다.
이렇게 복잡하게 구하는 이유는, 리눅스에서와 같이 파일 이름에 점(.)이 여러개 포함된 경우도 있기 때문입니다.
윈도우즈에서라면 대부분 두번째 배열에 확장자가 저장되어 있겠지만요…잠깐, 그런데 $upfile_name 이라는 변수는 도대체 어디에서 나왔을까요???
앞 강좌에서 upload.html 파일의 폼 태그에서 INPUT name을 upfile로 지정한 건 기억나죠?
그래서 upload_ok.php의 $upfile 변수는 바로 이걸 뜻합니다.
그런데, INPUT type이 “file”인 경우에는 $upfile에 “_name”이 붙은 새로운 변수가 자동으로 생성됩니다. 즉 $upfile_name 이라는 변수가 자동으로 만들어진다는 것이죠. 여기에 업로드된 파일의 이름(확장자 포함)이 저장되는 것입니다.
이 외에도 $upfile_size, $upfile_type 등의 변수가 자동으로 생성됩니다.
$upfile_size에는 업로드한 파일의 크기(byte 단위)가 저장되고, $upfile_type에는 업로드된 파일의 형식(MIME 타입)이 자동으로 저장됩니다.49, 53, 57, 61행을 유심히 보면 각각의 변수가 어떤 역할을 하는지를 잘 알 수 있습니다.
- if(!strcmp($extension,”html”) ||
- !strcmp($extension,”htm”) ||
- !strcmp($extension,”php”) ||
- !strcmp($extension,”inc”))
- {
- echo(“업로드 금지 파일입니다.”);
- exit;
- }
5행에서 strcmp 함수의 용도는 이미 알아 보았습니다.
따라서, 11행은 $extension 즉, 파일 확장자가 “html” 이거나
12행, “htm” 이거나
13행, “php” 이거나
15행, “inc” 이면
17,18행을 실행하라는 뜻이겠죠.
||는 or를 뜻한다는 거 아시죠? - $target = $target_dir . “/” . $upfile_name;
- if(file_exists($target)) {
$target 변수에는 디렉토리 이름과 파일 이름을 결합한 full name이 들어가게 됩니다.
3행에서 $target_dir을 “up”이라고 설정했으니, 만약 업로드한 파일 이름이 “itmembers.jpg”라면,
$target에는 “up/itmembers.jpg” 가 저장됩니다.22행의 file_exists 함수는 동일한 파일명을 가진 파일이 있는지 비교하는 역할을 합니다.
$target과 동일한 파일이 있으면 23행을 실행하게 됩니다. - if(!copy($upfile,$target)) { // false일 경우
copy 함수는 파일을 지정한 디렉토리에 복사하는 기능을 합니다.
$upfile을 $target으로 복사하게 됩니다. 이때 $target은 디렉토리 이름과 파일 이름이 모두 결합된 full name이어야 합니다.
28행의 조건문은, 이렇게 복사를 하는데 ‘만약 복사를 실패하게 되면’이라는 뜻이 되겠죠… - if(!unlink($upfile)) { // false일 경우
unlink 함수는 특정 파일을 삭제하는 기능을 합니다.
따라서 34행은 ‘$upfile 삭제에 실패했을 경우’라는 조건문이 되는 겁니다.

이 정도 설명을 드렸으니, 소스를 다시 한번 주~욱 보시면 이해가 되시겠죠?
이상 크리스마스 새벽에,
동주아빠, 손병목이었습니다.
