TIP게시판

제목 CI 3.1.1 이후 버전에서 파일 업로드 문제 시 php.ini에 php_fileinfo를 확장해주세요.
글쓴이 PENG 작성시각 2016/12/16 16:31:48
댓글 : 3 추천 : 0 스크랩 : 0 조회수 : 9356   RSS

안녕하세요, CI를 2013년부터 사용해오면서 포럼 글을 많이 봤지만 회원가입을 하고 글을 작성하는건 처음이네요 :)

3.0.x 버전을 계속 사용하다 최근 회사에서 3.1.2 버전으로 프로젝트를 새로 시작하게 됬습니다.

 

특별한 문제 없이 작업을 진행하던 도중 파일 업로드에 문제를 발견하고 글을 작성하게 되었습니다.

 

if( ! $this->upload->do_upload($field) ) {
    $errmsg = $this->upload->display_errors();
}
else {
    $fileInfo = $this->upload->data();
}

저는 보통 이런식으로 업로드 예외처리를 하고, 에러가 있으면 로그를 남기는 형식으로 진행을 해왔는데,

어떤 에러메시지도 없이 exit()함수를 호출한 것 처럼 프로그램이 멈춰버리는 현상이 있었습니다.

 

이는 3.1.1 버전 이후에 system/libraries/Upload.php 파일 내 코드가 변경되었기 때문인데요.

do_xss_clean()함수와 _file_mime_type()함수가 변경되었고, do_upload()함수와 관련있는 _file_mime_type()함수 변경에 발생한 문제였습니다.

 

* 기존코드

protected function _file_mime_type($file)
{
	// We'll need this to validate the MIME info string (e.g. text/plain; charset=us-ascii)
	$regexp = '/^([a-z\-]+\/[a-z0-9\-\.\+]+)(;\s.+)?$/';

	/* Fileinfo extension - most reliable method
	 *
	 * Unfortunately, prior to PHP 5.3 - it's only available as a PECL extension and the
	 * more convenient FILEINFO_MIME_TYPE flag doesn't exist.
	 */
	if (function_exists('finfo_file'))
	{
		$finfo = @finfo_open(FILEINFO_MIME);
		if (is_resource($finfo)) // It is possible that a FALSE value is returned, if there is no magic MIME database file found on the system
		{
			$mime = @finfo_file($finfo, $file['tmp_name']);
			finfo_close($finfo);

			/* According to the comments section of the PHP manual page,
			 * it is possible that this function returns an empty string
			 * for some files (e.g. if they don't exist in the magic MIME database)
			 */
			if (is_string($mime) && preg_match($regexp, $mime, $matches))
			{
				$this->file_type = $matches[1];
				return;
			}
		}
	}

	...

 

*변경된 코드

protected function _file_mime_type($file)
{
	// We'll need this to validate the MIME info string (e.g. text/plain; charset=us-ascii)
	$regexp = '/^([a-z\-]+\/[a-z0-9\-\.\+]+)(;\s.+)?$/';

	// Fileinfo extension - most reliable method
	$finfo = @finfo_open(FILEINFO_MIME);
	if (is_resource($finfo)) // It is possible that a FALSE value is returned, if there is no magic MIME database file found on the system
	{
		$mime = @finfo_file($finfo, $file['tmp_name']);
		finfo_close($finfo);

		/* According to the comments section of the PHP manual page,
		 * it is possible that this function returns an empty string
		 * for some files (e.g. if they don't exist in the magic MIME database)
		 */
		if (is_string($mime) && preg_match($regexp, $mime, $matches))
		{
			$this->file_type = $matches[1];
			return;
		}
	}

	...

 

크게 바뀐점은 없지만 function_exists()함수를 통해 finfo_file함수가 있는지 예외처리하는 부분이 사라져있습니다.

주석도 변경이 되었고, 당연히 php_fileinfo extension을 사용할거라는 뉘앙스가 느껴집니다.

 

그래서 php.ini를 열어보니 extension에 php_fileinfo가 빠져있었습니다.

이를 추가하는 것으로 해결되었습니다.

upload 라이브러리 호출 시 detect_mime을 FALSE로 바꿔주어도 되지만 권장하지는 않으니까요.

 

요약 :

3.1.1버전 이후 버전 파일 업로드 시 php.ini에 php_fileinfo를 extension해야한다.

 다음글 forge + git push를 이용한 배포방법입니다. (4)
 이전글 삼항연산자 $a = $a ?: null; 을 아시나요? (4)

댓글

변종원(웅파) / 2016/12/17 12:05:27 / 추천 0
정보 감사합니다.
홍구2 / 2016/12/18 14:19:20 / 추천 0
공유 감사합니다
한대승(불의회상) / 2016/12/21 16:19:46 / 추천 0

포스팅 안해 주셨으면 모르고 헤매고 있었을것 같습니다.

좋은 정보 감사 합니다.