php

[php Advanced] 2주차(3회차) / php 파일처리, 파일 업로드

namgi 2022. 9. 11. 01:53
반응형

php Advanced 2주차로,

파일처리에 대해 조금 더 자세하게 배웠다.

php 파일처리, 파일 업로드


파일 열기 및 읽기

현재 날짜: 2022-09-10, 
이름: 김남기,
사이트: namgi.tistory.com,
공부 언어: php

다음과 같은 'info.txt'파일이 있다고 가정해보자.

 

위 파일을 열기 위해서

'fopen() 함수'를 사용하면 된다.

 

코드를 봐보자.

<?php

//'info.txt'파일을 읽기전용으로 오픈, 없다면 '실행할 파일이 없습니다' 출력
$openfile = fopen("info.txt", "r") or die("실행할 파일이 없습니다.");
	
//'info.txt'파일을 열어 읽고 출력
echo fread($openfile,filesize("info.txt"));
	
//열린 파일 닫기
fclose($openfile);
?>

먼저 'openfile' 변수를 지정한다.

'openfile' 변수에는 'info.txt'파일을 읽기전용으로 열어준다.

열 파일이 없다면 '실행할 파일이 없습니다'를 출력한다.

 

실행 결과는 다음과 같다.

'info.txt'파일이 있는 경우

만약 'info.txt'파일이 없다고 가정해보자.

실행결과는 다음과 같다.

'info.txt'파일이 없는 경우

 

위 텍스트를 줄마다 끝에 도달할 때

뛰어 쓰는 것도 가능하다.

 

먼저 실행결과를 봐보자.

코드는 다음과 같다.

<?php

//'info.txt'파일을 읽기전용으로 오픈, 없다면 '실행할 파일이 없습니다' 출력
$openfile = fopen("info.txt", "r") or die("실행할 파일이 없습니다.");

//줄 끝에 도달했을 때 한 줄 비워두기
while(!feof($openfile)) {
  echo fgets($openfile) . "<br>";
}
fclose($openfile);
?>

'feof() 함수'는 텍스트의 끝에 도달했는지 확인하는 함수이다.

텍스트의 끝에 도달했다면 "<br>"로 한 칸 띄어준다.

 

'fgets() 함수'는 텍스트 파일에서 한 줄을 읽어준다.

 

파일 모드 설명
'r' 읽기 전용으로 파일을 염
'w' 파일의 내용을 지움, 존재하지 않는 경우 새 파일 생성
'a' 쓰기 전용으로 파일을 염, 파일의 기존 데이터는 보존
'x' 쓰기 전용으로 새 파일 생성, 파일이 존재하는 경우 FALSE 반환
'r+' 읽기/쓰기를 위해 파일을 염
'w+' 파일의 내용을 지움, 파일이 존재하지 않는 경우 새 파일 생성
'a+' 읽기/쓰기를 위해 파일을 염, 파일의 기존 데이터는 보존
'x+' 읽기/쓰기를 위한 새 파일 생성, 파일이 이미 존재하는 경우 FALSE 반환

 

새 파일 생성 및 쓰기

<?php

//'writefile.txt'라는 텍스트 파일을 새로 만들어 작성하게 함
$writefile = fopen("writefile.txt", "w") or die("실행할 파일이 없습니다.");
	
//새로 만들어진 'writefile.txt'에 밑 텍스트를 넣음
$txt = "안녕하세요 반갑습니다.\n";
fwrite($writefile, $txt);
$txt = "제 이름은 namgi입니다.\n";
fwrite($writefile, $txt);

fclose($writefile);
?>

위 코드를 실행한다면,

'writefile.txt' 텍스트 파일을 새로 만들고,

"안녕하세요 반갑습니다. 제 이름은 namgi입니다."를 입력하게 만든다.

 

새 파일을 생성할 때에는

'fopen() 함수'를 사용할 수 있고

'w(파일의 내용을 지움, 존재하지 않는 경우 새 파일 생성)'를 사용해야한다.

 

코드 실행 결과는 다음과 같다.

'writefile.txt'파일이 생성되고 텍스트가 입력된다.

 

파일에 텍스트 덮어쓰기도 가능하다.

 

기본적으로 생성한 'writefile.txt'에

문구만 밑의 코드처럼 바꿔준다면 텍스트가 바껴 실행된다.

<?php

//'writefile.txt'라는 텍스트 파일을 새로 만들어 작성하게 함
$writefile = fopen("wirtefile.txt", "w") or die("실행할 파일이 없습니다.");
	
//새로 만들어진 'writefile.txt'에 밑 텍스트를 넣음
$txt = "안녕히가세요. 수고하셨습니다.\n";
fwrite($writefile, $txt);
$txt = "제 이름은 unknown입니다.\n";
fwrite($writefile, $txt);

fclose($writefile);
?>

실행결과는 다음과 같다.

텍스트가 바뀐 것을 알 수 있다.

 

파일에 텍스트 추가도 가능하다.

텍스트 파일을 

'w'가 아닌 'a(쓰기 전용으로 파일을 염, 파일의 기존 데이터는 보존)'로 열어준다면,

텍스트가 추가되게 된다.

 

먼저 코드부터 봐보자.

<?php

//'w'를 'a'로 바꿈으로서 텍스트가 추가 되게 함
$writefile = fopen("wirtefile.txt", "a") or die("실행할 파일이 없습니다.");
	
//새로 만들어진 'writefile.txt'에 밑 텍스트를 넣음
$txt = "고생 많으셨습니다.\n";
fwrite($writefile, $txt);
$txt = "제 이름은 namgi입니다.\n";
fwrite($writefile, $txt);

fclose($writefile);
?>

'fopen("wirtefile.txt", "a")' 부분에서

원래 "w"였던 코드가 "a"로 바뀌니 밑 사진처럼 실행되게 된다.

파일 업로드

먼저 파일 업로드를 위한 HTML 양식부터 봐보자.

<!DOCTYPE html>
<html>
<body>

<!--데이터를 'fileup.php'로 보냄-->
<form action="fileup.php" method="post" enctype="multipart/form-data">
  업로드할 이미지 선택:
  
  <!--'input type=file'로 정함-->
  <input type="file" name="fileup" id="fileup">
  
  <!--제출 버튼-->
  <input type="submit" value="파일 업로드" name="submit">
</form>

</body>
</html>

 

파일이 업로드 되기 위해선 두 가지 필수요소가 있는데,

 

1. method="post"인지 확인해야한다.

2. enctype="multipart/form-data" 속성이 필요하다. 이 속성은 양식을 제출할 때 콘텐츠 유형을 지정한다.

 

13번 째 줄의,

<input> 태그에 type='file' 속성은 입력 필드를 '파일 선택' 으로 바꿔 버튼으로 만든다.

 

코드 실행결과는 다음과 같다.

'fileup.php'의 코드는 다음과 같다.

<?php

//파일이 저장될 디렉토리
$target_dir = "fileup/";

$target_file = $target_dir . basename($_FILES["fileup"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

//이미지 파일 True, false 체크
if(isset($_POST["submit"])) {
  $check = getimagesize($_FILES["fileup"]["tmp_name"]);
	
  //true일 때의 코드
  if($check !== false) {
    echo "파일 - " . $check["mime"] . ", ";
    $uploadOk = 1;
	  
	//false라면 실행
  } else {
    echo "이미지 파일이 아닙니다.<br>";
    $uploadOk = 0;
  }
}

//파일이 이미 존재하는지 확인
if (file_exists($target_file)) {
  echo "이미 존재하는 파일입니다.<br>";
  $uploadOk = 0;
}

// 파일 크기 제한
                     //파일크기 500KB 제한
if ($_FILES["fileup"]["size"] > 500000) {
  echo "피일 크기가 너무 큽니다!<br>";
  $uploadOk = 0;
}

// 피일 형식 제한
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
  echo "JPG, JPEG, PNG 및 GIF 파일만 업로드할 수 있습니다.<br>";
  $uploadOk = 0;
}

//파일 업로드가 안 됐을 때 실행
if ($uploadOk == 0) {
  echo "파일이 업로드 되지 않았습니다! 다시 확인해주세요.<br>";
	
//파일이 업로드 됐을 때 실행
} else {
  if (move_uploaded_file($_FILES["fileup"]["tmp_name"], $target_file)) {
    echo "파일, ". htmlspecialchars( basename( $_FILES["fileup"]["name"])). " 업로드 됨.";
  } else {
    echo "파일이 업로드 되지 않았습니다! 다시 확인해주세요.";
  }
}
?>

 

코드를 나눠서 천천히 봐보자.

//파일이 저장될 디렉토리
$target_dir = "fileup/";

$target_file = $target_dir . basename($_FILES["fileup"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

//이미지 파일 True, false 체크
if(isset($_POST["submit"])) {
  $check = getimagesize($_FILES["fileup"]["tmp_name"]);
	
  //true일 때의 코드
  if($check !== false) {
    echo "파일 - " . $check["mime"] . ", ";
    $uploadOk = 1;
	  
	//false라면 실행
  } else {
    echo "이미지 파일이 아닙니다.<br>";
    $uploadOk = 0;
  }
}

 

  • $target_dir = "fileup/" - 'fileup' 디렉토리에 파일 저장
  • $target_file - 업로드할 파일의 경로 지정
  • $imageFileType - 파일의 확장자 출력

사진이 저장되려면 'fileup.php' 파일이 있는 디렉토리에 'fileup' 이라는 폴더를 만들어줘야 합니다.

 

이미지 파일이 true 라면 'uploadOk 변수'가 1로(true) 반환되고,

파일의 확장자를 출력해 줍니다.

true일 때

이미지 파일이 false 라면 'uploadOk 변수'가 '0'으로(false) 반환되고,

'이미지 파일이 아닙니다'를 출력합니다.

false일 때

 

//파일이 이미 존재하는지 확인
if (file_exists($target_file)) {
  echo "이미 존재하는 파일입니다.<br>";
  $uploadOk = 0;
}

// 파일 크기 제한
                     //파일크기 500KB 제한
if ($_FILES["fileup"]["size"] > 500000) {
  echo "피일 크기가 너무 큽니다!<br>";
  $uploadOk = 0;
}

// 피일 형식 제한
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
  echo "JPG, JPEG, PNG 및 GIF 파일만 업로드할 수 있습니다.<br>";
  $uploadOk = 0;
}

위 코드는 파일 존재여부와 크기 제한, 형식 제한 역할을 하는 코드입니다.

 

'fileup' 폴더에 같은 파일이 있다면,

'이미 존재하는 파일입니다.'를 출력한다.

 

만약 파일 크기가 500KB 보다 크다면,

'파일 크기가 너무 큽니다.'를 출력한다.

 

파일의 형식이 'jpg, png, jpeg, gif'가 아니라면

'JPG, JPEG, PNG 및 GIF 파일만 업로드할 수 있습니다.'를 출력한다.

 

//파일 업로드가 안 됐을 때 실행
if ($uploadOk == 0) {
  echo "파일이 업로드 되지 않았습니다! 다시 확인해주세요.<br>";
	
//파일이 업로드 됐을 때 실행
} else {
  if (move_uploaded_file($_FILES["fileup"]["tmp_name"], $target_file)) {
    echo "파일, ". htmlspecialchars( basename( $_FILES["fileup"]["name"])). " 업로드 됨.";
  } else {
    echo "파일이 업로드 되지 않았습니다! 다시 확인해주세요.";
  }
}
?>

'uploadOk 변수'가 0이라면

파일이 업로드 되지 않은 것이다.

'파일이 업로드 되지 않았습니다! 다시 확인해주세요.'를 출력한다.

 

파일이 업로드 된다면,

파일의 확장자와 파일의 이름을 입력해주며 'fileup' 폴더에 파일을 저장시켜 준다.


이번 회차에선 php 파일처리, 파일 업로드에 대해 배웠다.

다음 회차에선 파일 업로드에 배워볼 것이다.

반응형