개발 꿀팁/PHP

PHP 구현 파일 업로드

Jammie 2022. 6. 30. 17:03
반응형

시간은 모든 것을 잊게 하고, 잊은 지식을 정리하는 것은 미래를 망각하게 한다!
많은 사이트들이 파일 업로드 기능을 구현해야 하는데, 이 기능은 크든 작든 작든 간에파일 업로드에 구멍이 뚫리면 사이트 통제권이 해커에게 넘어갈 수 있고, 모든 파일 업로드에 대한 통제는 엄격하고 엄격해야 하며, 파일 업로드의 허점 원리를 더욱 심도 있게 연구하기 위해 파일 업로드 기본 기능을 주로 작성해 간단한 체크만 했다.
먼저 내 앞 페이지를 봐. 여기 이마에 있는 코드와 원래 조금 다른 점이 있는데, 바로 채택이다.이진 전송 방법은 데이터 전송을 수행한다.전면 파일 이름: upload.php

<!DOCTYPE html>
<html>
<head>
	<title>파일 업로드</title>
	<meta charset="utf-8">
</head>
<body>
	<center>
		<!-- enctype="mulipart/form-data"속성이란 이진수 방식으로 데이터를 전송하는 것을 말한다
		전송 파일 설정 필요-->
		<form action="upload_server.php" method="post" enctype="multipart/form-data">
		<input type="hidden" name="max_file_size" value="1048576">
		<input type="file" name="file">
		<input type="submit" name="업로드">		
	</form>
	</center>
	
</body>
</html>

파일 업로드의 수신, 처리 모두 다음 코드에 기록되며 파일 이름은 upload_server.php입니다

<?php 
	header("content-type:text/html;charset=utf-8");
	//시간대 설정
	date_default_timezone_set('PRC');
	//파일 이름 가져오기
	$filename = $_FILES['file']['name'];
	//임시 파일 경로 가져오기
	$temp_name = $_FILES['file']['tmp_name'];
	//크기 가져오기
	$size = $_FILES['file']['size'];
	//파일 업로드 코드를 가져옵니다. 0은 파일 업로드 성공
	$error = $_FILES['file']['error'];
	//파일 크기가 최대 업로드 제한을 초과하는지 여부 판단
	if ($size > 2*1024*1024){
		//
		echo "<script>alert('파일 크기가 2M을 초과함');window.history.go(-1);</script>";
		exit();
	}
	//phpinfo함수는 배열로 파일 경로에 대한 정보를 반환합니다 
	//[dirname]:디렉터리 경로[basename]:파일 이름[extension]:파일 접미사 이름[filename]:不접미사가 없는 파일 이름
	$arr = pathinfo($filename);
	//파일의 접미사 이름 가져오기
	$ext_suffix = $arr['extension'];
	//파일을 업로드할 수 있는 접미사를 설정합니다
	$allow_suffix = array('jpg','gif','jpeg','png');
	//업로드한 파일이 허용 범위 내에 있는지 여부 판단(접미사)==>화이트리스트 판정
	if(!in_array($ext_suffix, $allow_suffix)){
		//window.history.go(-1)이전 페이지로 돌아가서 새로 고침
		echo "<script>alert('업로드할 파일 형식은 다음과 같습니다jpg,gif,jpeg,png');window.history.go(-1);</script>";
		exit();
	}
	//업로드 파일을 저장할 경로가 있는지, 존재하지 않으면 새 디렉터리
	if (!file_exists('uploads')){
		mkdir('uploads');
	}
	//업로드한 파일의 이름을 새로 지어서 더욱 안전할 것
	$new_filename = date('YmdHis',time()).rand(100,1000).'.'.$ext_suffix;
	//임시 경로에서 디스크로 파일 이동
	if (move_uploaded_file($temp_name, 'uploads/'.$new_filename)){
		echo "<script>alert('파일 업로드 성공!');window.history.go(-1);</script>";
	}else{
		echo "<script>alert('파일 업로드 실패, 오류 코드:$error');</script>";
	}

 ?>

문장 말미에 첨부파일에 error 코드와 의미를 올린다.
$_FILES['file']['error'] 다음과 같이 있습니다몇 가지 유형

1,UPLOAD_ERR_OK:0의 값, 오류 없음생, 파일 업로드 성공.

2,UPLOAD_ERR_INI_SIZE:1의 값업로드한 파일이 php.ini에서 upload_max_f를 초과함ilesize 옵션 제한 값입니다.

3,UPLOAD_ERR_FORM_SIZE: 그 값은 2, 업로드 파일의 크기가 HTML 폼의 MAX_FILE_S보다 큽니다IZE 옵션에서 지정한 값입니다.

4,UPLOAD_ERR_PARTIAL:3의 값,파일은 일부만 업로드 됩니다.

5,UPLOAD_ERR_NO_FILE:4의 값,업로드된 파일이 없습니다.

6,UPLOAD_ERR_NO_TMP_DIR: 그 값은 6,임시 폴더를 찾을 수 없습니다.PHP 4.3.10과 PHP 5.0.3 도입.

7,UPLOAD_ERR_CANT_WRITE: 그 값은 7, 파일을 쓸 수 없습니다.PHP 5.1.0 도입.

반응형