2012-09-05 37 views
26

我有2个文本字段和1个文件上传都是必需的。当我只需要文本字段时,一切正常,但是当我需要文件上传时,验证错误仍然表示需要文件,即使我选择了一个文件。任何人都知道我在做什么错了?提前谢谢了。CodeIgniter - 文件上传需要验证

//视图

<?php echo form_open_multipart('add'); ?> 

<fieldset> 
    <input type="text" name="name" /><br> 
    <input type="text" name="code" /><br> 
    <input type="file" name="userfile" /><br><br> 
    <input type="submit"value="Add" /> 
</fieldset> 

<?php echo form_close(); ?> 

//控制器

public function add() { 

    $this->form_validation->set_rules('name', 'Name', 'required'); 
    $this->form_validation->set_rules('code', 'Code', 'required'); 
    //$this->form_validation->set_rules('userfile', 'Document', 'required'); 
    //when the above line is active the upload does not go through 

    if ($this->form_validation->run() == FALSE) { 

     $data['page_view'] = $this->page_view; 
     $data['page_title'] = $this->page_title; 
     $this->load->view('template', $data); 
    } 
    else 
    { 
     $this->load->library('upload'); 

     if (!empty($_FILES['userfile']['name'])) 
     { 
      $config['upload_path'] = './uploads/'; 
      $config['allowed_types'] = 'gif|jpg|png|jpeg';  

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

      if ($this->upload->do_upload('userfile')) 
      { 
       $img = $this->upload->data(); 
       $file_name = $img['file_name']; 

       $name = $this->input->post('name'); 
       $code = $this->input->post('code'); 

       $this->load->model('create', 'create_model'); 
       $this->create_model->create_entry($name, $code, $file_name); 

       $data['page_view'] = $this->page_view; 
       $data['page_title'] = $this->page_title; 
       $this->load->view('template', $data); 
      } 
      else 
      { 
       echo $this->upload->display_errors(); 

      } 
     } 
    } 
} 
+0

我有一个建议,更好地插入你的HTML了。 – Red

+0

好吧,我添加了html,它非常基本,但不知道它是否会有所帮助。 – Staysee

+0

这可能是因为您试图上传太大的文件。尝试上传较小的文件,如果它工作正常,那么您可能需要更改'php.ini'中的设置,以便可以上传更大的文件。另外,如果你想快速调试这个,我建议你在''_FILES'超全局变量上做'var_dump()',看看文件上传的错误代码是什么。 –

回答

55

我找到了一个完全按照我的需要工作的解决方案。

我改变

$this->form_validation->set_rules('name', 'Name', 'trim|required'); 
$this->form_validation->set_rules('code', 'Code', 'trim|required'); 
$this->form_validation->set_rules('userfile', 'Document', 'required'); 

$this->form_validation->set_rules('name', 'Name', 'trim|required'); 
$this->form_validation->set_rules('code', 'Code', 'trim|required'); 
if (empty($_FILES['userfile']['name'])) 
{ 
    $this->form_validation->set_rules('userfile', 'Document', 'required'); 
} 
+0

您是否尝试过验证需要哪种文件类型? –

5

检查该表单验证扩展库,可以帮助你验证文件,与当前的表单验证当您验证上传字段其视为输入提交空值已空的表单验证库看起来真的很好的扩展

MY_Formvalidation

6

CodeIgniter的文件上传可选...完美的作品...... :)

----- -----控制器---------

function file() 
{ 
$this->load->view('includes/template', $data); 
} 

function valid_file() 
{ 
$this->form_validation->set_rules('userfile', 'File', 'trim|xss_clean'); 

if ($this->form_validation->run()==FALSE) 
{ 
    $this->file(); 
} 
else 
{ 
    $config['upload_path'] = './documents/'; 
    $config['allowed_types'] = 'gif|jpg|png|docx|doc|txt|rtf'; 
    $config['max_size']  = '1000'; 
    $config['max_width']  = '1024'; 
    $config['max_height'] = '768'; 

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

    if (!$this->upload->do_upload('userfile',FALSE)) 
    { 
    $this->form_validation->set_message('checkdoc', $data['error'] = $this->upload->display_errors()); 

    if($_FILES['userfile']['error'] != 4) 
    { 
     return false; 
    } 

    } 
    else 
    { 
    return true; 
    } 
} 

我只是用这个线,使得它可选,

if($_FILES['userfile']['error'] != 4) 
{ 
return false; 
} 

$_FILES['userfile']['error'] != 4 is for file required to upload. 

你可以把它无需使用$_FILES['userfile']['error'] != 4,那么它会通过此错误所需的文件,并与其他类型的错误,如果任何的伟大工程使用回报虚假, 希望工程ü....

0

您可以通过覆盖CI_Form_Validation

的运行功能

复制本功能解决呢扩展CI_Form_Validation的类。

该函数将覆盖父类函数。在这里,我只加一个额外的检查,它可以处理文件还

/** 
* Run the Validator 
* 
* This function does all the work. 
* 
* @access public 
* @return bool 
*/ 
function run($group = '') { 
    // Do we even have any data to process? Mm? 
    if (count($_POST) == 0) { 
     return FALSE; 
    } 

    // Does the _field_data array containing the validation rules exist? 
    // If not, we look to see if they were assigned via a config file 
    if (count($this->_field_data) == 0) { 
     // No validation rules? We're done... 
     if (count($this->_config_rules) == 0) { 
      return FALSE; 
     } 

     // Is there a validation rule for the particular URI being accessed? 
     $uri = ($group == '') ? trim($this->CI->uri->ruri_string(), '/') : $group; 

     if ($uri != '' AND isset($this->_config_rules[$uri])) { 
      $this->set_rules($this->_config_rules[$uri]); 
     } else { 
      $this->set_rules($this->_config_rules); 
     } 

     // We're we able to set the rules correctly? 
     if (count($this->_field_data) == 0) { 
      log_message('debug', "Unable to find validation rules"); 
      return FALSE; 
     } 
    } 

    // Load the language file containing error messages 
    $this->CI->lang->load('form_validation'); 

    // Cycle through the rules for each field, match the 
    // corresponding $_POST or $_FILES item and test for errors 
    foreach ($this->_field_data as $field => $row) { 
     // Fetch the data from the corresponding $_POST or $_FILES array and cache it in the _field_data array. 
     // Depending on whether the field name is an array or a string will determine where we get it from. 

     if ($row['is_array'] == TRUE) { 

      if (isset($_FILES[$field])) { 
       $this->_field_data[$field]['postdata'] = $this->_reduce_array($_FILES, $row['keys']); 
      } else { 
       $this->_field_data[$field]['postdata'] = $this->_reduce_array($_POST, $row['keys']); 
      } 
     } else { 
      if (isset($_POST[$field]) AND $_POST[$field] != "") { 
       $this->_field_data[$field]['postdata'] = $_POST[$field]; 
      } else if (isset($_FILES[$field]) AND $_FILES[$field] != "") { 
       $this->_field_data[$field]['postdata'] = $_FILES[$field]; 
      } 
     } 

     $this->_execute($row, explode('|', $row['rules']), $this->_field_data[$field]['postdata']); 
    } 

    // Did we end up with any errors? 
    $total_errors = count($this->_error_array); 

    if ($total_errors > 0) { 
     $this->_safe_form_data = TRUE; 
    } 

    // Now we need to re-set the POST data with the new, processed data 
    $this->_reset_post_array(); 

    // No errors, validation passes! 
    if ($total_errors == 0) { 
     return TRUE; 
    } 

    // Validation fails 
    return FALSE; 
} 
3

您可以使用回拨功能, 这样

$this->form_validation->set_rules('userfile', 'Document', 'callback_file_selected_test'); 

    if ($this->form_validation->run() == FALSE) { 
     //error 
    } 
    else{ 
      // success  
     } 

function file_selected_test(){ 

    $this->form_validation->set_message('file_selected_test', 'Please select file.'); 
    if (empty($_FILES['userfile']['name'])) { 
      return false; 
     }else{ 
      return true; 
     } 
} 
+0

就像一个魅力。 – jayz

0
  1. 设定的规则来检查文件名(如果形式是多部分)

    $this->form_validation->set_rules('upload_file[name]', 'Upload file', 'required', 'No upload image :(');

  2. ö verwrite的$_POST排列如下:

    $_POST['upload_file'] = $_FILES['upload_file']

  3. 然后执行:

    $this->form_validation->run()