2012-09-05 74 views
26

Tengo 2 campos de texto y 1 carga de archivo que son obligatorios. Todo funciona cuando solo necesito los campos de texto, pero cuando solicito la carga del archivo, el error de validación sigue diciendo que se requiere un archivo, aunque seleccioné uno. ¿Alguien sabe lo que estoy haciendo mal? Muchas gracias de antemano.CodeIgniter: validación requerida de carga de archivo

// vista

<?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(); ?> 

// controlador

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

Tengo una sugerencia, mejor insertar el html también. – Red

+0

Bien, agregué el html, aunque es muy básico, no estoy seguro de si será útil. – Staysee

+0

Podría deberse a que intentaste cargar un archivo que es demasiado grande. Intenta subir un archivo más pequeño, si funciona, entonces probablemente quieras cambiar la configuración en 'php.ini' para que puedas subir archivos más grandes. Además, si quiere depurar esto realmente rápido, le sugiero que haga un 'var_dump()' en el superglobal '$ _FILES' y vea cuál es el código de error del archivo cargado. –

Respuesta

55

Encontré una solución que funciona exactamente como yo quiero.

me cambió

$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'); 

Para

$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

¿Has probado la validación sobre qué tipo de archivo es necesario? –

5

cheque esta forma biblioteca de extensión de validación puede ayudar a validar los archivos, con la validación de forma actual al validar campo de carga que tratar como entrada archivado donde el valor está vacío tiene que buscar en esta muy buena extensión para la biblioteca de validación de formularios

MY_Formvalidation

6

CodeIgniter opcionalmente de carga de archivos ... funciona perfectamente ..... :)

----- ----- controlador ---------

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; 
    } 
} 

sólo tiene que utilizar estas líneas que lo hace opcionalmente,

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

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

puede que no sea necesario mediante el uso de $_FILES['userfile']['error'] != 4, entonces pasará este error para el archivo requerido y funciona muy bien con otros tipos de errores si los hay por utilizando retorno falsa, esperemos que funcione para u ....

0

se puede resolver reemplazando la función Ejecutar del CI_Form_Validation

copia esta func ción en una clase que amplía CI_Form_Validation.

Esta función anulará la función de clase principal.Aquí he añadido solamente una comprobación adicional que puede manejar archivos también

/** 
* 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

puede utilizar devolver la llamada función, como esto

$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

funciona como un encanto. – jayz

0
  1. establecer una regla para comprobar el nombre del archivo (si el es la forma de varias partes)

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

  2. o verwrite la matriz $_POST de la siguiente manera:

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

  3. y luego hacer:

    $this->form_validation->run()

Cuestiones relacionadas