CI 코드

제목 CI 파일 업로드 버그
글쓴이 마냐 작성시각 2009/08/23 22:05:00
댓글 : 4 추천 : 0 스크랩 : 0 조회수 : 21554   RSS

- 관련주소 : http://codeigniter.com/forums/viewthread/113029/

- 관련코드 /libraries/Upload.php

function is_allowed_filetype() {
  if (count($this->allowed_types) == 0 OR ! is_array($this->allowed_types)) {
    $this->set_error('upload_no_file_types');
    return FALSE;
  }

  $image_types = array('gif', 'jpg', 'jpeg', 'png', 'jpe');

  foreach ($this->allowed_types as $val) {
    $mime = $this->mimes_types(strtolower($val));

    // Images get some additional checks
    if (in_array($val, $image_types)) {
      if (getimagesize($this->file_temp) === FALSE) {
        return FALSE;
      }
    }

    if (is_array($mime)) {
      if (in_array($this->file_type, $mime, TRUE)) {
        return TRUE;
      }
    }
    else {
      if ($mime == $this->file_type) {
        return TRUE;
      }	
    }		
  }
		
  return FALSE;
}
- 버그상황
// Image 확장자와 기타 확장자가 같이 있는 경우
$config['allowed_types'] = 'jpg|gif|zip|txt';
----

코드가 좀 어이없긴 하네요. ㅡ_

foreach 로 allowed_types 을 돌리는데 업로드된 확장자 여부에 상관없이.
in_array($val, $image_types)) 를 반드시 하게 됩니다.

여기서 이미지파일이 아닌 파일은 mime type를 확인하기도 전에
if (getimagesize($this->file_temp) === FALSE)
위 조건에 걸려서 무조건 false 가 출력됩니다.

제대로 하려면.
foreach ($this->allowed_types as $val) {
  if ($확장자 == $val) {
    if (in_array($확장자, $image_types)) {
      // 이미지처리
    }
    // 처리
  }
  // 패쓰
}
와 같은 형식으로 코어코드가 수정되어야 합니다.
앞서 말한대로 코드가 좀 어이없죠.

코어수정 없이 해결하려면.
관련주소의 http://codeigniter.com/forums/viewthread/113029/#575124

$allowed_types = 'pdf|doc|jpg|zip|png|gif';
$config['allowed_types'] = substr($allowed_types, strpos($allowed_types, substr($_FILES['userfile']['name'], -3)), 3);
와 같이 업로드된 파일에 해당하는 확장자만 넘겨주면 됩니다.
substr로 확장자 구하는건 정확성이 떨어지니...
preg_match("/\.(".$allowed_types.")$/i", $_FILES['userfile']['name'], $ext);
$config['allowed_types'] = (isset($ext[1])) ? $ext[1] : false;
정도로 하면 되겠네요.
 다음글 [lib추가] CI RSS Parser 이용하기 (1)
 이전글 [예제] 엑티브 레코드 기초 사용 (4)

댓글

emc / 2009/08/24 09:43:52 / 추천 0
버그가 있었군요.
감사..
변종원(웅파) / 2009/08/25 16:19:19 / 추천 0
1.7.2에서는 해결되겠죠? ^^
가우리언 / 2010/03/29 09:37:18 / 추천 0
1.7.2 에서도 해결이 안된듯 합니다.
개발사랑 / 2014/08/08 18:05:36 / 추천 1
현재 ci 포럼에 올라와 있는 것은 예전것으로 core 소스는 많이 수정되었습니다.
hwp파일이 올라가지 않았던 이유는 코드이그나이터에 등록된 파일 확장자가 아니어서 였습니다.
이에 core소스를 분석한 결과 아래와 같은 코드를 발견했습니다.
/application/config/mimes.php

$mimes = array( 'hqx' => 'application/mac-binhex40',
    'cpt' => 'application/mac-compactpro',
    'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel'),
    'bin' => 'application/macbinary',
    'dms' => 'application/octet-stream',
    'lha' => 'application/octet-stream',
    'lzh' => 'application/octet-stream',
    'exe' => array('application/octet-stream', 'application/x-msdownload'),
    'class' => 'application/octet-stream',
    'psd' => 'application/x-photoshop',
    'so' => 'application/octet-stream',
    'sea' => 'application/octet-stream',
    'dll' => 'application/octet-stream',
    'oda' => 'application/oda',
    'pdf' => array('application/pdf', 'application/x-download'),
    'ai' => 'application/postscript',
    'eps' => 'application/postscript',
    'ps' => 'application/postscript',
    'smi' => 'application/smil',
    'smil' => 'application/smil',
    'mif' => 'application/vnd.mif',
    'xls' => array('application/excel', 'application/vnd.ms-excel', 'application/msexcel'),
    'ppt' => array('application/powerpoint', 'application/vnd.ms-powerpoint'),
    'wbxml' => 'application/wbxml',
    'wmlc' => 'application/wmlc',
    'dcr' => 'application/x-director',
    'dir' => 'application/x-director',
    'dxr' => 'application/x-director',
    'dvi' => 'application/x-dvi',
    'gtar' => 'application/x-gtar',
    'gz' => 'application/x-gzip',
    'php' => 'application/x-httpd-php',
    'php4' => 'application/x-httpd-php',
    'php3' => 'application/x-httpd-php',
    'phtml' => 'application/x-httpd-php',
    'phps' => 'application/x-httpd-php-source',
    'js' => 'application/x-javascript',
    'swf' => 'application/x-shockwave-flash',
    'sit' => 'application/x-stuffit',
    'tar' => 'application/x-tar',
    'tgz' => array('application/x-tar', 'application/x-gzip-compressed'),
    'xhtml' => 'application/xhtml+xml',
    'xht' => 'application/xhtml+xml',
    'zip' =>  array('application/x-zip', 'application/zip', 'application/x-zip-compressed'),
    'mid' => 'audio/midi',
    'midi' => 'audio/midi',
    'mpga' => 'audio/mpeg',
    'mp2' => 'audio/mpeg',
    'mp3' => array('audio/mpeg', 'audio/mpg', 'audio/mpeg3', 'audio/mp3'),
    'aif' => 'audio/x-aiff',
    'aiff' => 'audio/x-aiff',
    'aifc' => 'audio/x-aiff',
    'ram' => 'audio/x-pn-realaudio',
    'rm' => 'audio/x-pn-realaudio',
    'rpm' => 'audio/x-pn-realaudio-plugin',
    'ra' => 'audio/x-realaudio',
    'rv' => 'video/vnd.rn-realvideo',
    'wav' => array('audio/x-wav', 'audio/wave', 'audio/wav'),
    'bmp' => array('image/bmp', 'image/x-windows-bmp'),
    'gif' => 'image/gif',
    'jpeg' => array('image/jpeg', 'image/pjpeg'),
    'jpg' => array('image/jpeg', 'image/pjpeg'),
    'jpe' => array('image/jpeg', 'image/pjpeg'),
    'png' => array('image/png',  'image/x-png'),
    'tiff' => 'image/tiff',
    'tif' => 'image/tiff',
    'css' => 'text/css',
    'html' => 'text/html',
    'htm' => 'text/html',
    'shtml' => 'text/html',
    'txt' => 'text/plain',
    'text' => 'text/plain',
    'log' => array('text/plain', 'text/x-log'),
    'rtx' => 'text/richtext',
    'rtf' => 'text/rtf',
    'xml' => 'text/xml',
    'xsl' => 'text/xml',
    'mpeg' => 'video/mpeg',
    'mpg' => 'video/mpeg',
    'mpe' => 'video/mpeg',
    'qt' => 'video/quicktime',
    'mov' => 'video/quicktime',
    'avi' => 'video/x-msvideo',
    'movie' => 'video/x-sgi-movie',
    'doc' => 'application/msword',
    'docx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip'),
    'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip'),
    'word' => array('application/msword', 'application/octet-stream'),
    'xl' => 'application/excel',
    'eml' => 'message/rfc822',
    'json' => array('application/json', 'text/json'),
    'hwp'  => 'application/haansofthwp'
   );


하단에 보시면 제가 hwp를 추가한것을 보실 수 있습니다.
이는 코드이그나이터가 해외 프레임웍이라 한글 확장자가 없었던 것으로 보입니다. 그 옆에는 mimetype인데요
파일 올릴때 print_r($_FILES)를 하면 type을 알 수 있습니다. 이에 옆에 타입도 찾아서 수정해주었습니다.
그 이후로는 정상업로드 확인됩니다.
이외에 코드이그나이터에 등록되어 있던 확장자 docx등은 잘 업로드 되는 것을 확인했습니다.
이 부분 꼭 반드시 확인부탁드립니다.
혹시 한국에서 만든 프로그램 몇개 확장자가 등록되지 않을 경우 수동으로 추가해주어야 하기 때문입니다.
감사합니다.