TIP게시판

제목 멀티업로드에 do_upload를 그대로 이용하기
글쓴이 하늘치 작성시각 2013/11/12 22:05:25
댓글 : 2 추천 : 0 스크랩 : 1 조회수 : 23156   RSS
http://stackoverflow.com/questions/11524356/multiple-files-upload-array-with-codeigniter-2-0

일단, 출처를 밝힙니다.
사실, 꼼수와 같은 방법이라 이렇게 쓰는 게 나중에 혹시나 시스템상으로 문제가 될 수도 있는 것인지.. 고수님들께서 여유가 있으실 때 확인해주셨으면 하는 바람입니다.. ^^;


보통은 업로드 프로세스 부분을 아래와 같이 쓰잖아요?
/**
 * $upload_dir : 업로드 경로
 * $field_name : <input> 태그의 name 값
 */

$config['upload_path']   = realpath($upload_dir);
$config['allowed_types'] = 'gif|jpg|jpeg|jpe|png';
$config['max_size']      = '2048';

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

그런데, 아래처럼 파일등록을 배열로 넘길 때는 do_upload() 를 사용할 수 없더군요.
<input name='userfile[]' type='file'>

그래서 검색해봤더니 해결책(???)을 누군가 내어놓았더라구요,
음.. 일단 제 입맛에 맞게 약간 변형시켰습니다.

/**
 * ----------------------------------------
 * upload_proc.php
 * ----------------------------------------
 * $upload_dir : 업로드 경로
 * $field_name : <input> 태그의 name 값
 * $multi_files : 업로드파일 배열 정보
 * $multi_index : 배열 index 값
 */

$field_name = 'userfile';
//$cnt_field = count($this->input->post($field_name));
$cnt_field = count($_FILES[$field_name]['name']);
if($cnt_field > 0) {
 $multi_files = $_FILES;
 for($i=0;$i<$cnt_field;$i++){
  //$this->Model_upload->multi_upload($field_name,'upload/images');
  $this->Model_upload->multi_upload($field_name,'upload/images',$multi_files,$i);
 }
}






/**
 * ----------------------------------------
 * Model_upload.php
 * ----------------------------------------
 * $upload_dir : 업로드 경로
 * $field_name : <input> 태그의 name 값
 * $multi_files : 업로드파일 배열 정보
 * $multi_index : 배열 index 값
 */

function multi_upload($field_name,$upload_dir, $multi_files=FALSE, $multi_index=FALSE) {
 $config['upload_path']   = realpath($upload_dir);
 $config['allowed_types'] = 'gif|jpg|jpeg|jpe|png';
 $config['max_size']      = '2048';

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

 /**
  * 멀티 업로드인 경우에만 해당됩니다.
  */
 if($multi_index !== FALSE)
 {
  $_FILES[$field_name]['name']= $multi_files[$field_name]['name'][$multi_index];
  $_FILES[$field_name]['type']= $multi_files[$field_name]['type'][$multi_index];
  $_FILES[$field_name]['tmp_name']= $multi_files[$field_name]['tmp_name'][$multi_index];
  $_FILES[$field_name]['error']= $multi_files[$field_name]['error'][$multi_index];
  $_FILES[$field_name]['size']= $multi_files[$field_name]['size'][$multi_index];
 }

 $upload_ok = $this->upload->do_upload($field_name);
}


제가 쓰는 걸 간소화시킨다고 하긴 했는데, 오류가 날지도 모르겠네요;;
퇴근시간 늦추고 쓰는 거니 혹 오류가 나더라도 이해를.. 부탁드립니다...


아무튼, 되긴 되더군요.

근데, 출처의 게시물을 읽다보니.. 어떤 분이 댓글 중에 '작동하기는 하지만, ugly 하다'고 하셨더라구요.
심정적으로 공감은 합니다만.. 아쉬운 건 저라서.. 헛헛-



 다음글 Active Record의 쿼리 캐싱 버그 (+ 수정된... (11)
 이전글 CI 개발시 어떤 IDE를 쓰시나요? ^^ (11)

댓글

한대승(불의회상) / 2013/11/13 15:45:57 / 추천 0
좋은 정보 감사 합니다.
아래 부분은 원문처럼 수정 하면 좋을것 같습니다.

// $cnt_field = count($this->input->post($field_name));

$cnt_field = count($_FILES[$field_name]['name']);


하늘치 / 2013/11/13 16:30:41 / 추천 0
감사합니다. ^^

지금에서야 다시 보니, 원문과 저 부분이 달랐네요.
왜 다르게 썼을까 싶어서 제가 작업했던 소스를 뒤적여봤는데, 이런 이유였습니다.

<div class="form-group">
  <input type="text" id="price_1" name="goods_price[]" />
  <input type="text" id="image_1" name="goods_image[]" />
</div>
<div class="form-group">
  <input type="text" id="price_2" name="goods_price[]" />
  <input type="text" id="image_2" name="goods_image[]" />
</div>

위 소스에서처럼 파일입력만 있는 것이 아니었는지라, 업로드파일존재여부( $_FILES[$field_name]['name'] ) 대신에 input name 으로 count 했었네요.. count 값으로 for 문을 돌릴 때 그 안에서 업로드도 처리하고, DB에 다른 정보들도 입력하고 했었거든요. 물론 저는 file 타입의 name 이 아닌, 다른 text 타입의 name 으로 했지만요..

음.. 설명하느라 사용한 단어들이 적절한 건지 모르겠네요. 헛헛;;

아무튼, 게시판에서처럼 그냥 파일만 여럿 등록하고자 할 때는 확실히, 원문처럼 하는 게 맞겠네요~

좋게 봐주셔서 감사합니다. ^^