파일업로드 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 이미지의 너비와 높이를 포함하는 문자열입니다. 이미지 태그에 삽입할 때 유용합니다.