파일업로드 File Uploading Class

CodeIgniter의 파일 업로딩 클래스는 파일을 업로드 할 수 있도록 해줍니다. 다양한 설정옵션이 있으며, 파일타입이나 크기등을 제한할 수 있습니다.

절차 The Process

파일을 업로드하는 과정은 다음의 일반 절차를 따릅니다:

  • 업로드 폼이 표시되고 사용자는 업로드할 파일을 선택합니다.
  • 폼이 전송(submit) 되면, 파일은 여러분이 정의한 위치에 업로드 됩니다.
  • 이때, 여러분이 선택한 옵션에 따라 파일이 업로드 허용된 된것인지 여부를 검사(validate)합니다.
  • 일단 업로드 되면 사용자에게 성공적으로 업로드 되었다는 메세지를 보여줍니다.

이 과정을 보여주기 위하여 간단한 튜토리얼을 보여드립니다. 그리고 그 아래 참조가이드를 제공합니다.

업로드 폼 생성 Creating the Upload Form

텍스트에디터를 사용하여 upload_form.php이라는 폼을 파일을 생성합니다. 그리고 아래 코드를 삽입한 후 application/views/ 디렉토리 아래 저장합니다:

<html>
<head>
<title>Upload Form</title>
</head>
<body>

<?php echo $error;?>

<?php echo form_open_multipart('upload/do_upload');?>

<input type="file" name="userfile" size="20" />

<br /><br />

<input type="submit" value="upload" />

</form>

</body>
</html>

위 코드를 보시면 form 헬퍼를 사용하여 여는 form 태그대신 사용한 것을 알수 있습니다. 파일업로드는 multipart form을 필요로 하므로 헬퍼는 적당한 태그를 자동으로 작성해줍니다. 그리고 $error 변수가 있다는 것을 알수 있으실 것입니다. 이 변수는 사용자의 실수에 대해서 에러 메세지를 보여줍니다.

성공 페이지 The Success Page

텍스트 에디터를 이용하여 upload_success.php파일을 작성합니다. 그리고 그 안에 아래 코드를 삽입한 후 application/views/ 디렉토리 아래 저장합니다:

<html>
<head>
<title>Upload Form</title>
</head>
<body>

<h3>Your file was successfully uploaded!</h3>

<ul>
<?php foreach ($upload_data as $item => $value):?>
<li><?php echo $item;?>: <?php echo $value;?></li>
<?php endforeach; ?>
</ul>

<p><?php echo anchor('upload', 'Upload Another File!'); ?></p>

</body>
</html>

컨트롤러 The Controller

텍스트 에디터를 이용하여 upload.php라는 이름의 컨트롤러 파일을 작성한 후 아래의 코드를 삽입하고 application/controllers/ 폴더 아래 저장합니다:

<?php

class Upload extends CI_Controller {

        public function __construct()
        {
                parent::__construct();
                $this->load->helper(array('form', 'url'));
        }

        public function index()
        {
                $this->load->view('upload_form', array('error' => ' ' ));
        }

        public function do_upload()
        {
                $config['upload_path']          = './uploads/';
                $config['allowed_types']        = 'gif|jpg|png';
                $config['max_size']             = 100;
                $config['max_width']            = 1024;
                $config['max_height']           = 768;

                $this->load->library('upload', $config);

                if ( ! $this->upload->do_upload())
                {
                        $error = array('error' => $this->upload->display_errors());

                        $this->load->view('upload_form', $error);
                }
                else
                {
                        $data = array('upload_data' => $this->upload->data());

                        $this->load->view('upload_success', $data);
                }
        }
}
?>

업로드 디렉토리 The Upload Directory

업로드한 이미지를 저장할 대상폴더가 필요합니다.CodeIgniter 가 설치된 루트폴더에 uploads 라는폴더를 생성하고 권한을 777로 합니다.

시도해보자 Try it!

작성한 폼을 테스트하기 위해 아래와 유사한 경로로 접근합니다:

example.com/index.php/upload/

업로드 폼을 보실 수 있으실 것입니다. 이미지 파일( jpg, gif, png 등)업로드를 시도해보세요 .컨트롤러의 경로가 올바르다면 제대로 작동하는 것을 확인하실 수 있습니다.

참조가이드 Reference Guide

업로드 클래스 초기화 Initializing the Upload Class

CodeIgniter의 다른 클래스들과 마찬가지로, 컨트롤러에서 $this->load->library() 함수를 이용하여 초기화 합니다:

$this->load->library('upload');

업로드 클래스가 로드되면, $this->upload 과 같이 업로드 객체를 사용하실 수 있습니다:

설정하기 Setting Preferences

다른 라이브러리들과 마찬가지로, 어떤 파일이 업로드 허용될지 설정할 수 있습니다. 위에서 만든 컨트롤러에서 아래의 설정을 추가해보세요:

$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size']     = '100';
$config['max_width'] = '1024';
$config['max_height'] = '768';

$this->load->library('upload', $config);

// Alternately you can set preferences by calling the ``initialize()`` method. Useful if you auto-load the class:
$this->upload->initialize($config);

위 설정은 대부분 무엇을 뜻하는지 직관적으로 알수 있으실 것입니다. 아래 테이블은 가능한 설정들을 보여줍니다.

설정들 Preferences

아래의 설정들이 사용 가능 합니다. 설정을 명시하지 않을 경우 사용될 기본값들도 확인하세요.

설정 Default Value 옵션 설명
upload_path None None 업로드 파일이 위치할 폴더 경로 .폴더는 쓰기 가능해야하며 경로는 절대경로 혹은 상대경로를 사용합니다.
allowed_types None None 업로드를 허용할 파일의 마임타입(mime types)을 설정합니다. 보통 파일 확장자는 마임타입으로 사용될 수 있습니다. 멀티플타입은 파이프를 이용하여 구분합니다.
file_name None Desired file name 설정해주면, CodeIgniter 는 업로드된 파일을 이 이름으로 변경할 것입니다. 파일 확장자는 반드시 허용된 확장자이어야 합니다. 만약 제공되지 않는 확장자라면, 원래 파일명이 사용될 것입니다.
file_ext_tolower FALSE TRUE/FALSE (boolean) TRUE 로 설정하면, 파일 확장자는 무조건 소문자로 될 것입니다.
overwrite FALSE TRUE/FALSE (boolean) true 로 설정된 상태에서, 같은 이름의 파일이 이미 존재한다면 덮어쓸것입니다. false 로 설정되어있으면, 파일명에 숫자가 추가로 붙게 됩니다.
max_size 0 None 업로드 파일의 최대크기(KB)를 지정합니다. 0으로 설정하면 크기 제한이 없게 됩니다. 대부분의 PHP는 php.ini 파일에 업로드 파일 크기 설정이 이미 되어있습니다.일반적으로 2 MB ( 2048 KB)가 기본입니다.
max_width 0 None 업로드 파일의 최대 너비(픽셀단위) 를 설정합니다. 0 이면 제한이 없습니다.
max_height 0 None 업로드 파일의 최대 높이(픽셀단위)를 설정합니다. 0이면 제한이 없습니다.
min_width 0 None 업로드 파일의 최소 너비(픽셀단위) 를 설정합니다. 0 이면 제한이 없습니다.
min_height 0 None 업로드 파일의 최소 높이(픽셀단위)를 설정합니다. 0이면 제한이 없습니다.
max_filename 0 None 파일 이름의 최대길이를 지정합니다.0이면 제한이 없습니다.
max_filename_increment 100 None When overwrite is set to FALSE, use this to set the maximum filename increment for CodeIgniter to append to the filename.
encrypt_name FALSE TRUE/FALSE (boolean) TRUE로 설정하면 파일이름은 랜덤하게 암호화된 문자열로 변합니다. 파일을 업로드한 사람이 파일명을 알수 없도록할 때 유용합니다
remove_spaces TRUE TRUE/FALSE (boolean) TRUE로 설정하면 파일명에 공백이 있을 경우 밑줄(_)로 변경됩니다. 이 옵션은 사용을 권장합니다.
detect_mime TRUE TRUE/FALSE (boolean) TRUE 로 설정하면, 서버사이드에서 코드 인젝션을 피하기 위해 수행됩니다. 만약 다른 옵션이 없다면 이 옵션을 해제하지 말아주세요. 그렇지 않으면 보안 이슈를 일으킬 수 있습니다.
mod_mime_fix TRUE TRUE/FALSE (boolean) TRUE 로 설정하면, 여러 파일 확장자명은 Apache mod_mime 이 트리거를 방지하기 위해 언더스코어를 붙입니다. 만약 업로드 디렉토리가 퍼블릭이라면, 보안 위험 때문에 이 옵션을 끄지 마세요.

환경설정 파일에 설정 Setting preferences in a config file

위 설정들을 컨트롤러대신 설정파일에서 할 수도 있습니다. 먼저 upload.php파일을 생성한 후 $config 배열을 그 안에 만듭니다. 그런다음 그 파일을 config/upload.php 로 저장하면 자동으로 설정이 적용될 것입니다. 그려면 $this->upload->initialize() 함수를 사용할 필요가 없습니다.

클래스 레퍼런스 Class Reference

class CI_Upload
initialize([array $config = array()[, $reset = TRUE]])
인수:
  • $config (array) – Preferences
  • $reset (bool) – Whether to reset preferences (that are not provided in $config) to their defaults
반환값:

CI_Upload instance (method chaining)

반환형:

CI_Upload

do_upload([$field = 'userfile'])
인수:
  • $field (string) – Name of the form field
반환값:

TRUE on success, FALSE on failure

반환형:

bool

여러분의 설정에 따라 업로드를 수행합니다.

Note

기본설정은 파일이 userfile라는 폼필드로부터 업로드 될 것이라고 기대합니다. 또한 폼은 multipart 타입이라야 합니다.

<form method="post" action="some_action" enctype="multipart/form-data" />

필드명을 여러분이 저장하고 싶다면 do_upload() 함수에 아래와 같이 그 이름을 파라미터로 넘겨주시면 됩니다:

$field_name = "some_field_name";
$this->upload->do_upload($field_name);
display_errors([$open = '<p>'[, $close = '</p>']])
인수:
  • $open (string) – Opening markup
  • $close (string) – Closing markup
반환값:

Formatted error message(s)

반환형:

문자열

do_upload() 함수가 실패했을 때 에러메시지를 추출해줍니다. 이 함수는 자동으로 echo 까지 수행해주지는 않습니다. 단지 데이터만 전달해줄뿐이므로 그 후처리는 여러분이 원하는대로 할 수 있습니다.

Formatting Errors

기본으로 위함수는 에러를 <p> 태그들로 감쌉니다. 여러분은 아래와 같은 방법으로 다른 구분자를 설정할 수 있습니다:

$this->upload->display_errors('<p>', '</p>');
data([$index = NULL])
인수:
  • $data (string) – Element to return instead of the full array
반환값:

Information about the uploaded file

반환형:

mixed

업로드한 파일에 관련된 모든 데이터를 배열의 형태로 리턴해주는 헬퍼 함수 입니다. 다음 프로토타입을 참조하세요:

Array
(
        [file_name]     => mypic.jpg
        [file_type]     => image/jpeg
        [file_path]     => /path/to/your/upload/
        [full_path]     => /path/to/your/upload/jpg.jpg
        [raw_name]      => mypic
        [orig_name]     => mypic.jpg
        [client_name]   => mypic.jpg
        [file_ext]      => .jpg
        [file_size]     => 22.2
        [is_image]      => 1
        [image_width]   => 800
        [image_height]  => 600
        [image_type]    => jpeg
        [image_size_str] => width="800" height="200"
)

배열에서 하나의 요소를 반환:

$this->upload->data('file_name');       // Returns: mypic.jpg

위 배열 아이템에 대한 설명입니다:

Item 설명
file_name 업로드한 파일이름입니다. 확장자까지 포함합니다.
file_type 파일의 마임타입(Mime type)입니다.
file_path 파일의 서버상 절대경로입니다.
full_path 파일이름까지 포함한 서버상의 절대경로입니다.
raw_name 확장자 없는 파일명입니다.
orig_name 원래파일 이름입니다. 파일이름을 암호화 하는 옵션을 사용한경우에만 유용합니다.
client_name 유저가 제공한 파일명
file_ext 점을 포함한 파일 확장자입니다.
file_size 킬로바이트(KB)로 표시된 파일 크기입니다.
is_image 파일이 이미지인지 아닌지를 나타냅니다. 1 = 이미지. 0 = 이미지아님.
image_width 이미지 너비.
image_height 이미지 높이.
image_type 이미지 타입. 일반적으로 점이 없는 파일 확장자 입니다.
image_size_str 이미지의 너비와 높이를 포함하는 문자열입니다. 이미지 태그에 삽입할 때 유용합니다.