개발 꿀팁/PHP

PHP 파일 형식 판단

Jammie 2022. 7. 13. 16:57
반응형

방법 1: pathinfo

코드 예:

/** 
	 * 파일 접미사를 가져옵니다. (파일 이름이 11.11이고, 11이 접미사가 아닐 경우 11은 접미사로 기본 설정됩니다.)
	 * $file string파일 경로나 파일 이름
	 */
	function get_extension($file){
		return pathinfo($file, PATHINFO_EXTENSION);
	}

설명: pathinfo의 구체적인 사용법은 php 매뉴얼을 볼 수 있습니다.그러나 이 방법은 파일 접미사만으로 파일 형식을 판단할 수 있고, HTML 접미사 파일이 .php 접미사처럼 수정되면 php 형식의 파일이 읽힌다.

방법2:$_FILES
php가 파일을 업로드하면 $_FILES['uploadfile']['type']으로 파일 형식을 가져올 수 있지만 pathinfo와 같은 문제가 있을 수 있으며 파일 접미사만으로 파일 클래스를 판단할 수 있습니다.유형.

방법 3: php Fileinfo 파일 가져오기MIME 형식 (finfo_open)
코드 예:

<?php
	$finfo = finfo_open(FILEINFO_MIME); // mime 종류 되돌리기
    $filename = '.\Uploads\2.zip';
    var_dump(finfo_file($finfo, $filename));
    finfo_close($finfo);
    die;

결과를 반환합니다.

설명: 파일이 있으면 파일 형식을 반환하고 그렇지 않으면 false를 반환합니다.이 방법은 php5.3.0+ 버전이 필요하다.반환된 결과에 따라 어떤 종류의 파일인지 판단할 수 있다.이 방법은 원본 파일의 형식을 이미 읽을 수 있도록 원문서가 수정되어도 된다.

방법 4: 판단으로 파일의 첫 6바이트를 읽습니다

<?php
// 공식 예
function minimime($fname) {
    $fh=fopen($fname,'rb');
    if ($fh) { 
        $bytes6=fread($fh,6);
        fclose($fh); 
        if ($bytes6===false) return false;
        if (substr($bytes6,0,3)=="\xff\xd8\xff") return 'image/jpeg';
        if ($bytes6=="\x89PNG\x0d\x0a") return 'image/png';
        if ($bytes6=="GIF87a" || $bytes6=="GIF89a") return 'image/gif';
        return 'application/octet-stream';
    }
    return false;
}
// 파일 첫 번째 4바이트를 16진수로 변환
function fileType($filename) {
    // 읽기 파일의 상위 4바이트, 하드코드로 판단
    $file = fopen ( $filename, "rb" );
    $strFile = fread ( $file, 4 ); //읽기 전용 파일 헤더 4바이트
    fclose ( $file );
    $strInfo = @unpack ( "C4chars", $strFile );  
    //dechex(),십진법을 십육진법으로 바꾸다。  
    $code = dechex ( $strInfo ['chars1'] ) .   
            dechex ( $strInfo ['chars2'] ) .   
            dechex ( $strInfo ['chars3'] ) .   
		    dechex ( $strInfo ['chars4'] );  
    $type = '';  
    switch ($code) //하드코드 값 체크리스트
    {
        case "504b34" :  
            $type = 'application/zip; charset=binary';  
            break;
        case "89504e47" :
            $type = 'image/png; charset=binary';  
            break; 
        default :
            $type = false;  
            break;
    }
    return $type;
}

설명: 이 방법은 결함이 있으며, 파일 형식이 다를 수 있으며, 파일의 첫 번째 4바이트는 동일할 수 있으며, 일부 파일 형식은 4바이트 미만의 파일 형식의 문자열을 나타냅니다.방법 3과 방법 4를 조합하여 사용하는 것을 생각할 수 있다.
파일 형식 하드코드 값 대조표: http://www.garykessler.net/library/file_sigs.html
(대조표의 영문 대문자는 소문자로 바꾸고, 첫 번째 숫자가 0일 때는 생략한다. eg:504B0304에서 읽은 것은 504b34)

반응형