파일 처리
파일 처리는 모든 웹 응용 프로그램의 중요한 부분이다.
종종 다른 작업을 위해 파일을 열고 처리해야 한다.
readfile()
readfile() 함수는 파일을 읽고 출력 버퍼에 쓴다.
서버에 저장된 “webdictionary.txt”라는 텍스트 파일이 있다고 가정하면 다음과 같다.
파일을 읽고 출력 버퍼에 쓰는 PHP 코드는 다음과 같다 (readfile() 함수는 성공시 읽은 바이트 수를 반환한다).
AJAX = Asynchronous JavaScript and XML CSS = Cascading Style Sheets HTML = Hyper Text Markup Language PHP = PHP Hypertext Preprocessor SQL = Structured Query Language SVG = Scalable Vector Graphics XML = EXtensible Markup Language
<?php echo readfile("webdictionary.txt"); ?>
fopen()
파일을 여는 더 좋은 방법은 함수를 사용하는 것이다.
이 fopen() 함수는 readfile() 함수보다 더 많은 옵션을 제공한다.
fopen()의 첫 번째 매개 변수는 열고자하는 파일의 이름을 포함하고 두 번째 매개 변수는 파일을 열어야 하는 모드를 지정한다.
다음 예제에서는 fopen() 함수가 지정된 파일을 열 수 없는 경우에도 메시지를 생성한다.
<?php $myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!"); echo fread($myfile,filesize("webdictionary.txt")); fclose($myfile); ?>
fread()
fread() 함수는 열린 파일에서 읽는다.
fread()의 첫 번째 매개 변수는 읽을 파일의 이름을 포함하고 두 번째 매개 변수는 읽을 최대 바이트 수를 지정한다.
fread($myfile,filesize("webdictionary.txt"));
fclose()
fclose() 함수는 열려 있는 파일을 닫는 데 사용된다.
작업을 마친 후 모든 파일을 닫는 것이 좋다.
파일을 닫으려면 닫으려는 파일 이름 (또는 파일 이름을 보유하는 변수)이 필요하다.
<?php $myfile = fopen("webdictionary.txt", "r"); fclose($myfile); ?>
fgets()
fgets() 함수는 파일에서 한 줄을 읽는 데 사용된다.
<?php $myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!"); echo fgets($myfile); fclose($myfile); ?>
feof()
feof() 함수는 “파일 끝”(EOF)에 도달했는지 확인한다.
feof() 함수는 알 수 없는 길이의 데이터를 반복하는 데 유용하다.
<?php $myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!"); while(!feof($myfile)) { echo fgets($myfile) . "
"; } fclose($myfile); ?>
CSS = Cascading Style Sheets
HTML = Hyper Text Markup Language
PHP = PHP Hypertext Preprocessor
SQL = Structured Query Language
SVG = Scalable Vector Graphics
XML = EXtensible Markup Language
fgetc()
fgetc() 함수는 파일에서 단일 문자를 읽는 데 사용된다.
fgetc() 함수를 호출하면 파일 포인터가 다음 문자로 이동한다.
<?php $myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!"); while(!feof($myfile)) { echo fgetc($myfile); } fclose($myfile); ?>
fopen()
fopen() 함수는 파일을 만드는 데에도 사용된다.
어쩌면 약간 혼란 스러울 수도 있지만 PHP에서는 파일을 여는 데 사용 된 것과 동일한 fopen() 함수를 사용하여 파일이 생성된다.
존재하지 않는 파일에서 사용하는 경우 파일이 쓰기 (w) 또는 추가 (a)를 위해 열려 있으면 파일이 생성된다.
$myfile = fopen("testfile.txt", "w")
fwrite()
fwrite() 함수는 파일에 쓰는 데 사용된다.
fwrite()의 첫 번째 매개 변수는 쓸 파일의 이름을 포함하고 두 번째 매개 변수는 쓸 문자열이다.
<?php $myfile = fopen("newfile.txt", "w") or die("Unable to open file!"); $txt = "John Doe\n"; fwrite($myfile, $txt); $txt = "Jane Doe\n"; fwrite($myfile, $txt); fclose($myfile); ?>
파일 업로드
php.ini
“php.ini” 파일을 통해 PHP가 파일 업로드를 허용하도록 구성되어 있는지 확인해야한다.
“php.ini”파일에서 file_uploads 지시문을 검색하고 On으로 설정하자.
file_uploads = On
양식
업로드하려는 파일을 선택할 수 있는 HTML 양식을 만들어야한다.
양식 조건:
- 양식에서 method=”post”를 사용해야한다.
- 양식에는 enctype=”multipart/form-data”라는 속성도 필요하다. 양식을 제출할 때 사용할 콘텐츠 유형을 지정한다.
<form action="upload.php" method="post" enctype="multipart/form-data"> Select image to upload: <input type="file" name="fileToUpload" id="fileToUpload"> <input type="submit" value="Upload Image" name="submit"> </form>
upload.php
<?php $target_dir = "uploads/"; // 파일을 배치할 디렉토리를 지정한다. $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); // 업로드할 파일의 경로를 지정한다. $uploadOk = 1; $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION)); // 파일의 파일 확장자를 보유한다. if(isset($_POST["submit"])) { $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); if($check !== false) { echo "File is an image - " . $check["mime"] . "."; $uploadOk = 1; } else { echo "File is not an image."; $uploadOk = 0; } } ?>
“upload.php” 파일이 있는 디렉터리에 “uploads”라는 새 디렉터리를 만들어야 한다.
업로드 된 파일이 저장된다.
파일이 이미 있는지 확인
먼저 파일이 “uploads”폴더에 이미 있는지 확인한다.
이 경우 오류 메시지가 표시되고 $uploadOk 0으로 설정된다.
if (file_exists($target_file)) { echo "Sorry, file already exists."; $uploadOk = 0; }
파일 크기 제한
파일 크기를 확인한다.
파일이 500KB보다 크면 오류 메시지가 표시되고 $uploadOk 0으로 설정된다.
if ($_FILES["fileToUpload"]["size"] > 500000) { echo "Sorry, your file is too large."; $uploadOk = 0; }
파일 형식 제한
사용자가 JPG, JPEG, PNG 및 GIF 파일만 업로드할 수 있도록 허용한다.
다른 모든 파일 형식은 $uploadOk을 0으로 설정하기 전에 오류 메시지를 표시한다.
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) { echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed."; $uploadOk = 0; }
전체 upload.php 코드
<?php $target_dir = "uploads/"; $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); $uploadOk = 1; $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION)); if(isset($_POST["submit"])) { $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); if($check !== false) { echo "File is an image - " . $check["mime"] . "."; $uploadOk = 1; } else { echo "File is not an image."; $uploadOk = 0; } } if (file_exists($target_file)) { echo "Sorry, file already exists."; $uploadOk = 0; } if ($_FILES["fileToUpload"]["size"] > 500000) { echo "Sorry, your file is too large."; $uploadOk = 0; } if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) { echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed."; $uploadOk = 0; } if ($uploadOk == 0) { echo "Sorry, your file was not uploaded."; } else { if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { echo "The file ". htmlspecialchars( basename( $_FILES["fileToUpload"]["name"])). " has been uploaded."; } else { echo "Sorry, there was an error uploading your file."; } } ?>