resource fopen ( string $filename , string $mode [, bool $use_include_path= false [, resource $context ]] )
(PHP 4, PHP 5)

fopen 함수는 파일을 열거나 새로 만들 수 있습니다. 첫 번째 인자는 파일명 또는 절대경로를 입력하고, 두 번째 인자는 다음 표의 모드를 사용할 수 있습니다.

모 드 설 명
r 읽기 전용으로 오픈합니다.
r+ 읽기와 쓰기 모드로 오픈합니다.
w 쓰기 전용으로 오픈합니다.
기존 파일 내용은 완전히 지워지고, 새로 만듭니다.
파일이 존재하지 않는다면 새로 만듭니다.
w+ 읽기와 쓰기 모드로 오픈합니다.
기존 파일 내용은 완전히 지워지고, 새로 만듭니다.
파일이 존재하지 않는다면 새로 만듭니다.
a 내용 추가, 파일의 끝에 내용을 추가합니다.
파일이 존재하지 않는다면 새로 만듭니다.
a+ 내용 추가와 읽기모드로 오픈하여 파일의 끝에 내용을 추가합니다.
파일이 존재하지 않는다면 새로 만듭니다.
b 바이너리모드로 오픈합니다.
윈도우환경에서는 필수 모드

다음은 바이너리 그림 출력 예제입니다.

<?php
 // rb -> 읽기전용, 바이너리로 오픈합니다.
 if($fp = fopen('logo.gif', 'rb')){
     // 바이너리로 읽기
     // 파일 포인터로 지정된 파일에서 최대 길이 1024*100 만큼 브라우저로 출력합니다.
      print(fread($fp,1024*100));
      flush();
      // 파일을 오픈하면, 다른 스크립트에서  이용할 수 있도록 반드시 파일 포인터를 닫아야 합니다.
      fclose($fp);
 } else {
     print('파일을 찾을 수 없습니다.');
 }
 ?>

<?php
 $filename = 'test.bmp';

 header("content-type: file/unknown");
 header("content-length: ".filesize($filename));
 header("content-disposition: attachment; filename=\"${filename}\"");
 header("content-description: php generated data");
 header("pragma: no-cache");
 header("expires: 0");

 if($fp = fopen($filename, 'rb')){
     while(!feof($fp)) {
          print(fread($fp,1024));
          flush();
     }
     fclose($fp);
 } else {
     print('파일을 찾을 수 없습니다.');
 }
 ?>

fpassthru 함수는 처음 파일 포인터에서 끝까지의 파일 내용을 읽어 표준 출력으로 보냅니다.

<?php
 // 읽기전용으로 오픈합니다.
 if($fp = fopen('readme.txt', 'rb')){
       fpassthru($fp);
       flush();
       fclose($fp);
 } else {
     print('파일을 찾을 수 없습니다.');
 }
 ?>

fopen 함수가 바이너리에 안전하지만 바이너리와 텍스트 파일을 구별할 수 있는 윈도우 시스템에서는 b 플래그는 중요합니다. 그리고 fopen 함수를 사용할 때 fputs 함수나 fgets 함수 보다는 fread 함수나 fwrite 함수를 사용하는 것이 권장되며, 바이너리와 텍스트 파일을 구분하지 못하는 유닉스에서는 b 플래그가 필요치 않으나 윈도우환경에서는 중요한 부분입니다. 시스템 환경이 바뀔 수 있는 부분이 있다면 b 플래그를 사용하는 것이 좋습니다.

fputs 함수나 fgets 함수로 바이너리로 열거나 작성하더라도 바이너리 자료를 유지하지 못하는  경우가 있으므로 바이너리 자료 그대로 유지되는 fread 함수나 fwrite 함수를 이용하는 것을 권고하고 있습니다.

<?php
 if($fp = @fopen('readme.txt', 'ab+')){
       fwrite($fp, "바이너리로 작성합니다.");
       fclose($fp);
 }
 
 if($fp = @fopen('readme.txt', 'rb')){
       fread($fp);
       ob_flush();
       flush();
       fclose($fp);
 } else {
     print('파일을 찾을 수 없습니다.');
 }
 ?>

0 댓글