여러분이 사용하고 계신 브라우저는 HTML5를 지원하지 않기 때문에 몇몇 요소가 제대로 보이도록 JScript를 사용하고 있습니다. 하지만 여러분의 브라우저 설정에서 스크립트 기능이 꺼져있으므로, 현재 페이지를 제대로 확인하시려면 스크립트 기능을 켜주셔야 합니다. PHP - 기초 - 파일 처리
PHP – 기초 – 파일 처리
2년전 작성
12개월전 수정

파일 처리

파일 처리는 모든 웹 응용 프로그램의 중요한 부분이다.
종종 다른 작업을 위해 파일을 열고 처리해야 한다.

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
<?php
echo readfile("webdictionary.txt");
?>
기본 예시
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 Language236

fopen()

파일을 여는 더 좋은 방법은 함수를 사용하는 것이다.
이 fopen() 함수는 readfile() 함수보다 더 많은 옵션을 제공한다.

fopen()의 첫 번째 매개 변수는 열고자하는 파일의 이름을 포함하고 두 번째 매개 변수는 파일을 열어야 하는 모드를 지정한다.
다음 예제에서는 fopen() 함수가 지정된 파일을 열 수 없는 경우에도 메시지를 생성한다.

PHP
<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
echo fread($myfile,filesize("webdictionary.txt"));
fclose($myfile);
?>
기본 예시
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
매개 변수
r
:
읽기 전용으로 파일을 연다. 파일 포인터가 파일 시작 부분에서 시작된다.
w
:
쓰기 전용으로 파일을 연다. 파일의 내용을 지우거나 파일이 없는 경우 새 파일을 만든다. 파일 포인터가 파일 시작 부분에서 시작된다.
a
:
쓰기 전용으로 파일을 연다. 파일의 기존 데이터가 보존된다. 파일 포인터는 파일 끝에서 시작한다. 파일이 없는 경우 새 파일을 만든다.
x
:
쓰기 전용 새 파일을 만든다. 파일이 이미 있는 경우 FALSE 및 오류를 반환한다.
r+
:
읽기/쓰기를 위해 파일을 연다. 파일 포인터가 파일 시작 부분에서 시작된다.
w+
:
읽기/쓰기를 위해 파일을 연다. 파일의 내용을 지우거나 파일이 없는 경우 새 파일을 만든다. 파일 포인터가 파일 시작 부분에서 시작된다.
a+
:
읽기/쓰기를 위해 파일을 연다. 파일의 기존 데이터가 보존됩니다. 파일 포인터는 파일 끝에서 시작한다. 파일이 없는 경우 새 파일을 만든다.
x+
:
읽기/쓰기용 새 파일을 만든다. 파일이 이미 있는 경우 FALSE 및 오류를 반환한다.

fread()

fread() 함수는 열린 파일에서 읽는다.

fread()의 첫 번째 매개 변수는 읽을 파일의 이름을 포함하고 두 번째 매개 변수는 읽을 최대 바이트 수를 지정한다.

fread($myfile,filesize("webdictionary.txt"));

fclose()

fclose() 함수는 열려 있는 파일을 닫는 데 사용된다.

작업을 마친 후 모든 파일을 닫는 것이 좋다.

파일을 닫으려면 닫으려는 파일 이름 (또는 파일 이름을 보유하는 변수)이 필요하다.

<?php
$myfile = fopen("webdictionary.txt", "r");
fclose($myfile);
?>

fgets()

fgets() 함수는 파일에서 한 줄을 읽는 데 사용된다.

PHP
<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
echo fgets($myfile);
fclose($myfile);
?>
기본 예시
AJAX = Asynchronous JavaScript and XML

feof()

feof() 함수는 “파일 끝”(EOF)에 도달했는지 확인한다.

feof() 함수는 알 수 없는 길이의 데이터를 반복하는 데 유용하다.

PHP
<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");

while(!feof($myfile)) {
echo fgets($myfile) . "
"; } fclose($myfile); ?>
기본 예시
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

fgetc()

fgetc() 함수는 파일에서 단일 문자를 읽는 데 사용된다.

fgetc() 함수를 호출하면 파일 포인터가 다음 문자로 이동한다.

PHP
<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
while(!feof($myfile)) {
echo fgetc($myfile);
}
fclose($myfile);
?>
기본 예시
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

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”라는 속성도 필요하다. 양식을 제출할 때 사용할 콘텐츠 유형을 지정한다.
HTML
<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
<?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
<?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.";
}
}
?>
참고

Mingg`s Diary
밍구
공부 목적 블로그