728x90

PHP 파일 업로그 관련 함수와 예제를 간단하게 작성해봤다.


리눅스에서 APM(Apache, PHP, MySQL) 소스 설치를 여러번 연습하다보니 php.ini 환경설정 변수 설정이 중요하다는 걸 알게 되었다.

파일 업로드를 위해서 php.ini 설정을 수정해줘야 한다.

기본 설치를 하면 파일 업로드 용량이 작게 설정되어 있다.

file_uploads = on  // PHP 를 사용해서 파일 업로드를 허용할 것인지를 결정하는 항목

upload_tmp_dir=  // 이 항목에 값을 지정하지 않으면 시스템이 사용하는 임시 디렉토리를 사용하게 됨

upload_max_filesize = 50M   // 업로드되는 파일의 최대 크기를 지정하는 항목

post_max_size = 60M  // 파일은 POST 방식으로 서버에 전달. upload_max_filesize 보다 반드시 커야 한다.



bool is_uploaded_file(filename) 함수는 파일 업로드 양식을 통해 파일이 POST 방식으로 업로드되었는지 여부를 조사하는 함수이다.

is_uploaded_file() 함수의 인자는 실제 파일 이름이 아니라 임시 디렉토리에 존재하는 임시 파일 이름이다.


bool move_uploaded_file(임시파일명, 실제파일명);

임시 디렉토리에 업로드된 파일을 새로운 디렉토리로 이동시킨다.

먼저 임시 디렉토리를 조사하여,

- 업로드된 파일이 존재하지 않으면 False를 반환한다.

- 파일은 존재하지만 지정된 위치로의 이동이 실패하면 False를 반환한다.


bool file_exists(realname);

파일명(realname)이 존재하는지 조사하여 존재하면 True, 없으면 False 를 반환한다.

이 함수는 파일을 업로드할 때 서버에 동일한 이름의 파일이 존재하는지 조사하기 위해 주로 사용한다.

filename 은 파일명 자체를 의미하지 않고, 실제 업로드할 파일 경로 + 파일명을 의미한다.

$filepath_name = "../files" . "/" . $realname;

if( file_exists($filepath_name)) {

    echo '동일한 이름을 가진 파일이 존재합니다';

    exit;

}


스크립트 언어는 실행엔진만 서버에 적재되어 있다면 언제든 실행이 가능하다.

보안을 위협할 수 있는 코드가 삽입된 스크립트 문서나 실행 가능한 파일이 업로드 되지 않도록 해야 시스템의 보안 문제를 방지할 수 있다.


========= Form 데이터 파일 =================

// PHP 에서 파일을 업로드 하는 경우 업로드되는 파일은 반드시 POST 방식으로 전달되어야 한다.

// 파일을 첨부하기 위해서는 <form> 태그에 enctype 속성의 값으로 "multipart/form-data"를 지정해야 한다.
<form name="procForm" method=POST action="addresswrite.php" enctype="multipart/form-data" onsubmit="return saveCheck(this);">
    <input type=file name="excel" size=30 /><br /><br />
    <input type=submit value="전송" />
</form>

<script type="text/javascript">
//<![CDATA[
function saveCheck(f)
{
    if (f.excel.value == '')
    {
        alert('CSV 파일을 선택해 주세요.');
        f.excel.focus();
        return false;
    }
}
//]]>
</script>

========== addresswrite.php =====================
<?php
// POST 방식으로 전달받은 파일을 검사하여 업로드 및 파일 read 하여 DB에 데이터 저장 처리
$tmpname    = $_FILES['excel']['tmp_name'];  // 임시파일명

if (is_uploaded_file($tmpname))  // 임시파일이 디렉토리에 존재하는 경우
{

    $realname    = $_FILES['excel']['name'];  // 실제 파일명
    $filesize    = $_FILES['excel']['size']; // 파일 크기
    $filetype    = $_FILES['excel']['type']; // 파일 형태
    $fileExt    = strtolower(getExt($realname));  // 파일 확장자 구하는 함수

    $saveFile    = $g['dir_module'].'files/csv/'.$csvfile;

    if (!strstr('[csv][xlsx]',$fileExt))   // 업로드 가능 확장자 조사
    {
        getLink('','','csv, xlsx 파일만 등록할 수 있습니다.','');
    }

    // 동일한 이름을 가진 파일이 존재하는 지 검사, unlink 하여 파일을 지우지 않을 경우

    // if(file_exists($saveFile))
    move_uploaded_file($tmpname,$saveFile);  // 임시 디렉토리에 있던 파일을 실제 파일의 이름으로 전송

    @chmod($saveFile,0606);  // 리눅스에서 파일 권한 변경
}

// 파일을 업로드한 후 파일을 연다
$file=fopen($saveFile,"r");
if(!$file){
    echo("Failed to open the file");
    exit;
}

while($line = fgetcsv($file,1000, ";")) { // 구분자는 ; 로 지정, 한줄씩 읽어드린 값을 마지막행까지 계속하라.
    $line0    = iconv("euc-kr", "utf-8", $line[0]); // 파일의 인코딩 모드가 ANSI 일 경우 UTF8 로 변경처리
    $line1    = iconv("euc-kr", "utf-8", $line[1]);
    // 구분자로 분리해서 읽어들인 항목을 DB의 칼럼에 대입하여
    // 신규 등록 또는 기존 자료 중복체크 등을 수행한다.
}
fclose ($file);   // 성공하면 1을 반환하고 실패하면 0을 반환
unlink($saveFile);  // 업로드한 실제 파일 삭제
// 등록건수 및 중복건수 팝업창 보여주기
?>

블로그 이미지

Link2Me

,