예전에는 파일 업로드에 크게 신경을 쓰지 않았었는데 어제는 간단한 작업을 해봤는데 문제가 꽤 많더군요.
시작 부분의 프로그램 코드는 다음과 같습니다.
uploadimg.php
<?php
//업로드 인터페이스인지 구현 인터페이스인지 확인합니다. 업로드 인터페이스인 경우 다음 HTML 페이지를 표시합니다.
if(!$_POST['UploadAction']):
?>
<html>
<머리>
<제목></제목>
</head>
<본문><테이블><가운데>
<form enctype="multipart/form-data" name="SubmitForm" action="" method="post">
<input type="hidden" name="UploadAction" value="1">
<tr><td><input name="UploadFile" type="file" size="30"></td></tr>
<tr><td><input type="submit" name="submit" value="업로드"></td>
<td><input type="reset" name="reset" value="Reset"></td></tr>
</form>
</center></table></body>
</html>
<?php
//구현 페이지인 경우 다음 HTML 페이지를 표시하고 PHP 스크립트를 활성화합니다.
그렇지 않으면:
?>
<html>
<머리>
<제목></제목>
</head>
<본문>
<?php
//www.knowsky.com은 UploadAction의 상태를 초기화합니다.
$UploadAction=0;
$UploadFile=$_POST['UploadFile'];
if(($UploadFile!="없음") && ($UploadFile!=""))
{
$UploadPath=$_SERVER['DOCUMENT_ROOT']."\";
if (!is_writeable($UploadPath))
{
echo "$UploadPath 디렉토리에 쓸 수 없습니다!";
}
또 다른
{
echo "$UploadPath 디렉토리에 쓰기가 가능합니다!";
}
$FileName=$UploadFile_name;
if($UploadFile_size<1024)
{
$FileSize=(string)$UploadFile_size."바이트";
}
elseif($UploadFile_size<(1024*1024))
{
$FileSize=number_format((double)($UploadFile_size/1024),1)."KB";
}
또 다른
{
$FileSize=number_format((double)($UploadFile_size/(1024*1024)),1)."KB";
}
if(!file_exists($UploadPath.$FileName))
{
if(move_uploaded_file($UploadFile,$UploadPath.$FileName))
{
echo "$UploadFile_name 파일($FileSize)이 성공적으로 업로드되었습니다!";
}
또 다른
{
echo "파일 $UploadFile_name ($FileSize) 업로드에 실패했습니다!";
}
연결 해제($UploadPath.$FileName);
}
또 다른
{
echo "$UploadFile_name 파일이 이미 존재합니다!";
}
}
또 다른
{
echo "업로드할 파일을 선택하지 않았거나 업로드한 파일이 $MAX_FILE_SIZE를 초과합니다!";
}
?>
<br><a href="uploadimg.php">반환</a>
</body>
</html>
<?php
endif
?>
실행해 보니 업로드가 전혀 효과가 없고, 구현 페이지에도 들어가지 못하는 것을 발견하고, 검색해서 문의한 결과, 업로드된 파일을 얻기 위해서는 $_FILES가 필요하다는 것을 알게 되었기
때문에 몇 가지를 변경했습니다.
$UploadFile=$_FILES['업로드파일']['tmp_name'];
$UploadFile_size=$_FILES['업로드파일']['크기'];
$UploadFile_name=$_FILES['업로드파일']['이름'];
$FileName=strtolower($UploadFile_name);
이제 완료될 줄 알았는데 다음과 같은 오류 메시지가 나타났습니다.
경고: move_uploaded_file(F:Serverwww): 스트림을 열지 못했습니다: 76행의 F:Serverwwweooolfinishuploadimg.php에서 권한이 거부되었습니다.
경고: move_uploaded_file(): 76행에서 F:Serverwwweooolfinishuploadimg.php의 'E:WINDOWSTEMPphp34.tmp'를 'F:\Server\www'로 이동할 수 없습니다.
파일 *****(****bytes) 업로드에 실패했습니다!
그리고 WIN 시스템에서 디버깅을 하다가 파일 권한 문제는 없을 거라 찾아보고 고민했는데, 그래도 해결이 안되서 라오라오와 조이에게 도움을 청하는 글을 올렸습니다. 하지만 정답을 얻지 못했습니다. 간단한 파일 업로드에는 하루 이상이 걸렸고 여전히 완료되지 않아 인터넷에서 나와 유사한 오류를 찾을 수 없었습니다.
결국 사블로그로 디버깅을 하다가 첨부파일을 성공적으로 업로드할 수 있었던 이유는 무엇인지 고민할 수밖에 없었습니다. 그래서 사블로그에 첨부파일을 업로드하기 위한 원본 코드를 주의 깊게 살펴보고, 코드를 기반으로 다음과 같이 변경했습니다.
함수 getextension($filename) {
return substr(strrchr($filename, "."), 1);
}
$extension=getextension($FileName);
if(move_uploaded_file($UploadFile,$UploadPath."temp.".$extension))
//unlink($UploadFile);
unlink($UploadPath."temp.".$extension);
결과는 바로 받았고, 업로드는 성공적이었습니다!
여기서는 unlink($UploadPath."temp.".$extension); 을 사용하여 공간에 업로드된 파일을 즉시 삭제하고 공간을 절약합니다.