2017-01-01 35 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

抱歉,延迟重播...这就是我的观点,你有什么想法做到这一点。 –

相关问题