CI 묻고 답하기

제목 파일업로드 기능이 있는 폼양식에 대한 의견이 듣고 싶습니다.
글쓴이 예나아범 작성시각 2014/10/11 14:40:26
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 13129   RSS
현재 만들고 있는건 프로필을 올릴 수 있는 페이지 입니다.

프로필 사진 1개와 3개의 이미지 첨부, 3개의 파일 첨부가 있고 제목, 내용 같은 일반 폼도 있습니다.

처음에는 jquery plugin을 활용할까도 했지만, CI의 기능을 적극 활용하고자 배제하고 만들기 시작했습니다.

컨트롤러에서는 대략

1. 폼검증 (파일을 제외한 나머지 필드를 검증합니다.)

2. 파일 검증(파일이 존재하면, data 폴더에 고유키값의 폴더를 생성하고 거기에 파일을 upload 합니다. upload 시 에러가 나면 alert 하고 원래 write 페이지로 이동합니다.)

3. 모든 검증이 완료되면 모델로 데이터를 보내 DB에 저장하고 성공 페이지를 보여줍니다.

여기서 2번 작업을 하면서 제가 원하는 퍼포먼스가 잘 안나옵니다.

1) 업로드 되는 파일이 조건에 일치하지 않는 경우 write 페이지에 기존 입력값이 나오지 않습니다.(alert 후 페이지를 다시 불러오기때문에 그런거 같습니다.)

2) 성공적으로 업로드 된 파일에 대해서는 write 페이지에서 업로드한 파일명을 보여주고, 제거나 수정이 가능하도록 하고 싶습니다.

1)의 문제를 해결하기 위해 input값들을 input->post로 전부 배열에 집어 넣고 이를 파일검증에서 에러가 났을때 세션의 flash 데이터로 집어 넣고 다시 불러오려 했지만 실패, 에러가 났을때마다 view를 다시 불러오면서 배열을 넣어 봤지만... 이 역시도 실패....

2)의 문제는 손도 못대고 있네요..ㅠㅠ

 

public function pf_write()
 {  
  $this->load->library('upload');
  $this->load->library('form_validation');
  $this->load->helper('alert');

  $this->form_validation->set_rules('title', 'lang:title', 'required');
        $this->form_validation->set_rules('carrier', 'lang:carrier', 'required');
        $this->form_validation->set_rules('introduce', 'lang:introduce', 'required');
        
  if ($this->form_validation->run() == FALSE)  //폼검증 
  {
   $menu['var'] = '3';
   
   $data['val'] = $this->session->flashdata('val');

   $data['img'] = FALSE;
   
   $this->load->view('common/header');
   $this->load->view('common/wk_menu', $menu);
   $this->load->view('profile/pf_write', $data);
   $this->load->view('common/footer');
  }
  else 
  { 
   $dir_name = './data/profile/'.$this->session->userdata('user_id');                   
    //디렉토리 생성
   
   if(is_dir($dir_name) != 1){
    mkdir($dir_name, 0777, TRUE);
    mkdir($dir_name.'/img', 0777, TRUE);
    mkdir($dir_name.'/doc', 0777, TRUE);
   }

   $menu['var'] = '3';
   
   $data['img'] = read_file('./data/profile/'.$this->session->userdata('user_id').'/'.$this->session->userdata('user_id').'_180.png');  

   //input 데이터 배열로 입력
   $data['val'] = array(
    'prof'        =>  $this->input->post('prof', TRUE),
    'pf_type'     =>  $this->input->post('pf_type', TRUE),
    'corp'        =>  $this->input->post('corp', TRUE),
    'title'       =>  $this->input->post('title', TRUE),
    'carrier'     =>  $this->input->post('carrier', TRUE),
    'introduce'   =>  $this->input->post('introduce', TRUE)
   );

   //파일 검증시작

   if($_FILES['pf_photo']['name'] != '') 
   {
    $config['upload_path'] = $dir_name;
          $config['allowed_types'] = 'gif|jpg|png';
          $config['max_size'] = '400';
          $config['max_width']  = '300';
          $config['max_height']  = '300';
    $config['encrypt_name'] = TRUE;

    $this->upload->initialize($config);

    if ( ! $this->upload->do_upload('pf_photo'))
    {
     $error = $this->upload->display_errors('','');
           
     $this->session->set_flashdata('val',$data['val']);
     alert($error, '/profile/pf_write');
     exit;
     //이부분이 문제네요 ㅠㅠ 에러가 나면 flashdata를 만드는데 이걸 못불러옵니다. 그리고 저 flashdata 부분에 view도 불러와봤구요.


          }
    else
    {
     $data['pf_photo'] = $this->upload->data();

     $info = $this->upload->data();
           $size = array(180,92,64,32);
           $this->resize_copy($info, $size);
    }
   }
            
            for($i=1; $i < 4; $i++)
   {
    $file_name = 'pf_file_img'.$i;
    if($_FILES[$file_name]['name'] != '')
    {
     $config['upload_path'] = './data/profile/'.$this->session->userdata('user_id').'/img';
              $config['allowed_types'] = 'gif|jpg|png';
              $config['max_size'] = '2048';
     $config['max_width']  = '0';
              $config['max_height']  = '0';
     $config['encrypt_name'] = TRUE;

        $this->upload->initialize($config);

     if ( ! $this->upload->do_upload($file_name))
     {
      $error = $this->upload->display_errors('','');
      
      $this->session->set_flashdata('val',$data['val']);
      alert($error, '/profile/pf_write');
      exit;
      //이미지 파일 세개를 올릴때 에러시 처리입니다.

     }
     else
     {
      $data[$file_name] = $this->upload->data();
     }
    }
   }

   for($i=1; $i < 4; $i++)
   {
    $file_name2 = 'pf_file_doc'.$i;
    if($_FILES[$file_name2]['name'] != '')
    {
     $config['upload_path'] = './data/profile/'.$this->session->userdata('user_id').'/doc';
     $config['allowed_types'] = 'doc|docx|ppt|pptx|xls|xlsx|pdf';
              $config['max_size'] = '2048';
     $config['encrypt_name'] = TRUE;

        $this->upload->initialize($config);

     if ( ! $this->upload->do_upload($file_name2))
     {
      $error = $this->upload->display_errors('','');
      
      $this->session->set_flashdata('val',$data['val']);
      alert($error, '/profile/pf_write');
      exit;
      //문서 파일 세개를 올릴때 에러시 처리입니다.

     }
     else
     {
      $data[$file_name2] = $this->upload->data();
     }
    }
   }

   echo (json_encode($data)); //여기는 모두 성공 시 모델로 보내기 전에 DATA 확인을 위해 임시로 써 놓은 내용입니다.
  }
 }

갈아업고 이런식으로 다시해라도 좋으니 좋은 의견 부탁드립니다 ㅠㅠ
 
 다음글 저번에 한번 질문을 드리긴 했는데 (2)
 이전글 session 관련해서 질문드립니다. (2)

댓글

변종원(웅파) / 2014/10/13 10:07:53 / 추천 0
파일업로드 부분은 ci 폼검증이나 서버단에서 POST로 넘겨서 처리하기 보다는 jquery나 플래시를 이용한 
업로더를 이용하여 비동기로 처리하는게 좋습니다.

파일 업로드 버튼 클릭 -> 파일선택 -> ajax로 전송후 서버단 처리 -> 결과에 따라 다음 단계 또는 업로드 다시 처리
예나아범 / 2014/10/17 18:51:46 / 추천 0
아... 그렇겠군요. 일단 업로드 처리는 form_validation에 콜백함수를 쓰고, upload라이브러리 중 do_upload에서 조건검증 하는 부분만 따로 사용자 라이브러리로 만들어서 업로드파일을 우선 다 체크하도록 해서 에러가 나면 set_value로 페이지에 뿌려주는 식으로 처리를 했네요. 사용자 입장에서는 정상적으로 조건에 맞는 파일도 다시 업로드하라는 표시가 나오고 귀찮긴 하지만, 일단 그렇게 정리했습니다.

나중에 다시 ajax로 처리하도록 해봐야겠네요...