서버는 우분투이고 디렉토리 퍼미션은 777로 주었습니다.
php버전은 확실히 모르겠는데 HTTP_POST_FILES가 먹는걸 보니
4정도 되는 것 같구요
근데 왜 업로드가 안되는건지 모르겠습니다 ㅠㅠ
단순히 업로드 하는 부분만 따로 떼어서 공부하고 있는데
안되서 죽겠습니다 ㅠㅠ
<html>
<head>
<title>PHP 파일 업로드 기능</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
</head>
<body>
<form method="POST" ENCTYPE="multipart/form-data" action="upload_ok.php">
<table width="500" border="0" align="center" bgcolor="dddddd">
<tr>
<td width="600" colspan="2" align="center"><b>파일 업로드 기능</b></td>
</tr>
<tr>
<td width="100" align="center">파일명</td>
<td width="600"> <input type=file name="upfile" size="20">(파일의 용량 제한 : 20M)</td>
</tr>
<tr>
<td align="center" colspan="2">
<input type="submit" value="전송"> <input type="reset" value="취소">
</td>
</tr>
</table>
</form>
</body>
</html>
/********** upload_ok.php ***********/
// 업로드한 파일이 저장될 디렉토리 정의
$target_dir = "var/www/nang/up"; // 서버에 up 이라는 디렉토리가 있어야 한다.
if(strcmp($HTTP_POST_FILES['upfile'], ""))
{ // 파일이 업로드되었을 경우
// 업로드 금지 파일 식별 부분
$filename = explode(".", $HTTP_POST_FILES['upfile']['name']);
$extension = $filename[sizeof($filename)-1];
if(!strcmp($extension,"html") || !strcmp($extension,"htm") || !strcmp($extension,"php") || !strcmp($extension,"inc"))
{
echo("업로드 금지 파일입니다.");
exit;
}
// 동일한 파일이 있는지 확인하는 부분
$target = "var/www/nang/up/".$HTTP_POST_FILES['upfile']['name'];
if(file_exists($target)) {
echo("동일 파일명 존재");
exit;
}
// 지정된 디렉토리에 파일 저장하는 부분
if(!copy($upfile, $target))
{ // false일 경우
echo("파일 저장 실패");
exit;
}
// 임시 파일을 삭제하는 부분
if(!unlink($HTTP_POST_FILES['upfile'])) { // false일 경우
echo("임시 파일 삭제 실패");
exit;
}
?>
<html>
<body>
<table width="500" border="0" cellspacing="1" cellpadding="2" align="center">
<tr>
<td colspan="2" align="center" bgColor="#CCCCCC" width="100%"><font size=2><b>>>
업로드 성공 <<</b></font></td>
</tr>
<tr>
<td align="left" bgColor="#EEEEEE" width="120"><font size=2>파일명</font></td>
<td bgColor="#EEEEEE"><font size=2><?=$HTTP_POST_FILES['upfile']['name']?></font></td>
</tr>
<tr>
<td align="left" bgColor="#EEEEEE" width="120"><font size=2>임시 저장 파일명</font></td>
<td bgColor="#EEEEEE"><font size=2><?=$_POST[upfile]?></font></td>
</tr>
<tr>
<td align="left" bgColor="#EEEEEE" width="120"><font size=2>파일 크기(Bytes)</font></td>
<td bgColor="#EEEEEE"><font size=2><?=$HTTP_POST_FILES[upfile][size]?> Bytes</font></td>
</tr>
<tr>
<td align="left" bgColor="#EEEEEE" width="120"><font size=2>파일의 MIME Type</font></td>
<td bgColor="#EEEEEE"><font size=2><?=$_POST[upfile_type]?></font></td>
</tr>
</table>
<?
}
else
{
?>
<table width="500" border="0" cellspacing="1" cellpadding="2" align="center" bgcolor="#FFCCFF">
<tr>
<td width="100%" align="center" bgColor="#CCCCCC"><font size=2><b>업로드 실패!!!</b></font></td>
</tr>
</table>
</body>
</html>
<?
}
?>
어느 부분이 잘못된 건지 ㅠㅠㅠㅠㅠㅠ
한참 지식인도 찾아보고 책도 찾아봤는데도 안되네요 ㅠㅠㅠ
p.s:이 소스도 어느 분꺼 보고 따온것입니다 ㅠㅠ
추가된 질문 (2007-09-26 15:40 추가)
copy 부분이 안되는것 같기도 하구요 ㅠㅠㅠㅠㅠㅠㅠㅠ
[ 답변 ]
몇가지가 눈에 보이긴 하는데 맞을지는 의문이네요
왜냐하면 직접 질문내용의 소스를 실행하며 디버깅해보질 않았기 때문이죠 그러나
거의 맞을거 같으니 우선 답변드릴게요^^
우선 중간부분 copy($upfile,$target)
여기서 $upfile 이 정의되지 않았네요
이말의 뜻은 php.ini에서 register_global 옵션이 off 라면
해당 변수는 아무값을 가지지 않게 됩니다
그이유는 form으로 전달시 post 든 get방식이든 둘중하나로 전달하지만
php에서는 해당옵션이 off 라서 방식을 정의해주어야 하거든요
이렇게 정의해주셔야됩니다...
그리고 copy 보다 move_uploaded_file 을 사용하시길 권장합니다.
보다 빠른 코딩에 도움이 될것입니다..
사용방법은 move_uploaded_file("임시파일","이동될경로및파일")이 됩니다...
또하나 눈에 들어오는것은 unlink 부분인데 이부분은 업로드와 상관은 없겠지만
임시파일을 제거하려고 하는경우는 $HTTP_POST_FILES["upfile"]["tmp_name"];
으로 정의해주셔야 인식이 됩니다...
또한 정상적으로 업로드 되었는지 확인하는 구문을 넣는것이 보안상으로 좋을테니
if(!is_uploaded_file($upfile_tmp)) {
echo "정상적으로 업로드 되지 않았습니다...";
}
라고 넣어주시는것이 좋겟네요 ㅎㅎ




