[PHP] 파일 업로드
파일업로드
: 사용자가 선택한 파일을 전송했을때 그것을 php쪽에서 받아서 원하는 디렉토리에 위치시키는 것
▼ html파일의 form 태그
<form enctype="multipart/form-data" action="1.php" method="POST">
<!-- hidden : 화면상으론 표시되지않음. 사용자가 입력한 데이터가 아니라 필요에 의해서 서버쪽으로 전송해야 하는 데이터가 있는 경우 사용
MAX_FILE_SIZE : 사용자가 전송하는 파일에 최대크기 지정하는것. type="file" input보다 먼저 지정되어야함 -->
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
<input name="userfile" type="file" />
<input type="submit" value="upload" />
</form>
form 태그의 action에 데이터를 보낼 파일을 지정하고, method는 post로 지정해주어야한다
enctype는 반드시 multipart/form-data 로 지정해주어야 파일을 전송할 수 있다.
파일 수신 에플리케이션
axit
이후의 코드들은 하나도 실행되지않고 php어플의 실행이 종료됨
$_FILES
업로드된 사용자가 보낸 파일의 정보가 배열로 담김
name : 파일의 실제이름
type : 이미지의 파일형식
tmp_name :
브라우저가 전송한 파일이 서버에 위치하는 임시디렉토리상의 경로.
이를 알고있어야 원하는 디렉토리로 파일을 보낼 수 있음
error : 파일을 업로드하는 과정에서 에러가 있는지 알 수 있음
size : 업로드된 파일의 크기
$uploaddir
임시 디렉토리에 위치하고있는 업로드파일이 이동할 파일 디렉토리를 지정함
( 예제 코드는 윈도우코드 )
서버 컴퓨터상의 경로
$uploadfile
업로드된 파일, 즉 임시디렉토리에 있는 파일이
어느 파일 디렉토리에 어느 파일명으로 저장되어야하는가에 대한 정보를 담고 있음
move_uploaded_file(실제 파일의 경로, 이동 경로)
이 함수 말고도 임시디렉토리에 있는 파일을 이동시킬수있는 방법은 있지만 move_uploaded_file 함수를 써야하는 이유는
업로드된 파일이 보안상으로 문제가 없는가 등을 체크하는 로직이 포함되어있기때문.
이 함수는 업로드에 성공할 경우 true를, 실패할 경우 false를 리턴한다
<?php
ini_set("display_errors", "1");
$uploaddir = 'C:\BitNami\wampstack-5.4.20-0\apache2\htdocs\upload\file\\';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "파일이 유효하고, 성공적으로 업로드 되었습니다.\n";
} else {
print "파일 업로드 공격의 가능성이 있습니다!\n";
}
echo '자세한 디버깅 정보입니다:';
print_r($_FILES);
print "</pre>";
?>
ini_set
이 PHP의 설정을 런타임으로 지정하는 것
php.ini을 무효화해서 php를 실행하고있는 코드에서만 유효한 설정을 세팅하는 것
기본적으로 php세팅에서 display_errors가 꺼져있는 상태가 많기 때문에 두번째 인자로 1을 주어 켜준 상태
basename()
파일의 실제 이름에 경로 등의 위치를 제외하고, 파일로서의 의미만 갖게하기위해 사용
정확한 파일명만 남김 ( 보안이슈 )