2017-01-01 28 views
0

我有一個圖像上傳和一些個人數據的multipart/form-data,所以我想包括文件上傳在表單驗證,我可以成功地做到這一點。是否有更好的方式進行多部分/表單數據驗證

但是,我現在發現有一個問題,即即使我的其他表單字段有錯誤,並沒有錯誤上傳文件字段,然後圖像上傳到文件夾,如何防止這,我的意思是,在我的情況下,如果姓名,電子郵件,文件中的字段驗證是好的那麼只有文件應上傳,如果名義提交的驗證失敗和文件字段驗證OK,然後文件不應該上傳

這裏是我使用的代碼:

在控制器:

<?php 
    public $_rules = array(
      'name'=>array('field'=>'name', 'label'=>'Name', 'rules'=>'trim|required'), 
      'email'=>array('field'=>'email', 'label'=>'Email', 'rules'=>'trim|required|valid_email'),  
      'profile_img'=>array('field'=>'profile_img', 'label'=>'Design', 'rules'=>'callback__profile_upload') 
      ); 

public function profile() 
    {  
     $this->load->library('upload'); 
     $rules = $this->_rules; 
     $this->form_validation->set_rules($rules); 

     if($this->form_validation->run()==TRUE){ 
      die('success'); 
     }else {   
      $this->data['content'] = 'frontend/pages/place_order'; 
      $this->load->view('frontend/_layout_main', $this->data); 
     } 

    } 

function _profile_upload(){ 
    if($_FILES['profile_img']['size'] != 0 && !empty($_FILES['profile_img'])){ 
    $upload_dir = './profile_pics/'; 
    if (!is_dir($upload_dir)) { 
     mkdir($upload_dir); 
    } 
    $config['upload_path'] = $upload_dir; 
    $config['allowed_types'] = 'gif|jpg|png|jpeg'; 
    $config['file_name']  = 'profile_img_'.substr(md5(rand()),0,7); 
    $config['overwrite']  = false; 
    $config['max_size'] = '5120'; 

    $this->upload->initialize($config); 
     if (!$this->upload->do_upload('profile_img')){ 
      $this->form_validation->set_message('_profile_upload', $this->upload->display_errors()); 
      return false; 
     } 
     else{ 
      $this->upload_data['file'] = $this->upload->data(); 
      return true; 
     } 
    } 
    else{ 
     $this->form_validation->set_message('_profile_upload', "No file selected"); 
     return false; 
    } 
} 

IN VIEW:

<?php echo form_open_multipart();?> 
<?php $name_err = (!empty(form_error('name'))) ? 'err' : ' '; 
    echo form_input('name',set_value('name'), array('placeholder'=>'Name','class'=>" {$name_err } ")); 
    ?> 

<?php $email_err = (!empty(form_error('email'))) ? 'err' : ' '; 
    echo form_input('email',set_value('email'), array('placeholder'=>'EMail','class'=>" {$email_err } ")); 
    ?> 
<?php  
echo form_error('profile_img'); 
echo form_upload(array('name' =>'profile_img', 'class' => 'inputfile inputfile-4', 'id' => 'profile_img')); 
?> 
    <li><input type="submit" class="special" value="Submit" /></li> 
+0

您是否使用ajax發送表單數據? –

+0

@HikmatSijapati不使用ajax –

+0

然後表單提交後調用哪個函數? –

回答

0

我已得到codexWorld一個解決方案,我也問過同樣的問題在那裏,他們回答道教程,如果有人還在這裏尋找一個解決方案是在驗證鏈接

http://www.codexworld.com/codeigniter-file-upload-validation/

再打,我們只想做文件類型檢查

public function _profile_upload($str){ 
     $allowed_mime_type_arr = array('image/jpeg','image/pjpeg','image/png','image/x-png'); 
     $mime = get_mime_by_extension($_FILES['file']['name']); 
     if(isset($_FILES['file']['name']) && $_FILES['file']['name']!=""){ 
      if(in_array($mime, $allowed_mime_type_arr)){ 
       return true; 
      }else{ 
       $this->form_validation->set_message('_profile_upload', 'Please select only pdf/gif/jpg/png file.'); 
       return false; 
      } 
     }else{ 
      $this->form_validation->set_message('_profile_upload', 'Please choose a file to upload.'); 
      return false; 
     } 
    } 

和我們只想做一樣正常使用do_upload並指定上傳的配置項主要功能,總之會有第二文件類型檢查函數執行時,我認爲沒關係。代碼將如下所示::

public function profile() 
    {  
     $rules = $this->_rules; 
     $this->form_validation->set_rules($rules); 

     if($this->form_validation->run()==TRUE){ 
      $config['upload_path'] = 'uploads/files/'; 
      $config['allowed_types'] = 'gif|jpg|png'; 
      $config['max_size']  = 1024; 
      $this->load->library('upload', $config); 
      //upload file to directory 
      if($this->upload->do_upload('file')){ 
       $uploadData = $this->upload->data(); 
       $uploadedFile = $uploadData['file_name']; 

       /* 
       *insert file information into the database 
       *....... 
       */ 

      }else{ 
       $data['error_msg'] = $this->upload->display_errors(); 
      } 
     }else {   
      $this->data['content'] = 'frontend/pages/place_order'; 
      $this->load->view('frontend/_layout_main', $this->data); 
     } 

    } 
0

嘗試一次像這樣。我認爲圖像不需要像其他字段設置規則。

public $_rules = array(
     'name'=>array('field'=>'name', 'label'=>'Name', 'rules'=>'trim|required'), 
     'email'=>array('field'=>'email', 'label'=>'Email', 'rules'=>'trim|required|valid_email'),  
     ); 

而且

public function profile() 
    {  
     $this->load->library('upload'); 
     $rules = $this->_rules; 
     $this->form_validation->set_rules($rules); 

     if($this->form_validation->run()==TRUE){ 
      die('success'); 
     }else {  
      if ($this->_profile_upload()) { //return true if file uploaded successfully otherwise error 
       $this->data['content'] = 'frontend/pages/place_order'; 
       $this->load->view('frontend/_layout_main', $this->data); 
       }  

     } 

    } 
+0

請檢查我的回調函數...我正在設置文件上傳錯誤,以形成驗證錯誤消息數組 –

0

是的,這是非常明顯的,你的文件上傳得甚至任何其他領域的驗證失敗。只有在表單驗證成功後,才能啓動圖像上傳。 爲此,只需驗證該回調中的文件特定要求,並在成功驗證表單後進行實際上傳。

+0

抱歉,延遲重播...這就是我的觀點,你有什麼想法做到這一點。 –

相關問題