2011-03-03 20 views
8

Me preguntaba si hay una forma de validar el tamaño de un archivo con la clase de validación de formularios en CodeIgniter 2.0. Tengo un formulario que contiene un archivo de entrada y quiero hacer algo como esto:CodeIgniter - Validación de formulario y datos de carga de archivos

$this->form_validation->set_rule('file', 'File', 
       'file_type[image/jpeg|image/gif|image/png]|file_max_size[500]'); 

pensé en extender la clase de validación de combinarlo con la clase de carga y validar en base a los datos de carga, pero que podría toma mucho tiempo.

¿Alguien sabe de alguna extensión para la clase de validación de formularios que haría algo como esto?

+2

Normalmente hago esto validando primero el formulario y, si todo está bien, comienzo a verificar la validez de la carga del archivo. – janosrusiczki

Respuesta

10

La carga de archivos de clase en realidad tiene su propio conjunto de reglas de validación se puede configurar como tal

$config['upload_path'] = './uploads/'; 
$config['allowed_types'] = 'gif|jpg|png'; 
$config['max_size'] = '100'; 
$config['max_width'] = '1024'; 
$config['max_height'] = '768'; 

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

(taken from CI docs)

+0

Si el archivo no se ajusta a la configuración de validación, ¿se actualizarán los errores de validación del formulario? Por ejemplo, si el archivo es demasiado grande, ¿la función validation_errors() mostrará un mensaje de error que lo diga? – ShoeLace1291

+1

No tiene que tratar los errores de carga de archivos por separado, así que primero verificaría la validación del campo de entrada, luego 'do_upload()' y hay una función para mostrar específicamente cargar errores de validación. Todo está en la documentación a la que me enlace en mi respuesta. – jondavidjohn

+2

Si agrega el campo de carga en la validación, pero no le da ninguna regla de validación ('$ this-> form_validation-> set_rules ('file_to_upload', 'File To Upload', '');'), entonces puede coloque el mensaje de error de carga en el objeto form_validation y se mostrará correctamente automáticamente ('$ this-> form_validation -> _ field_data ['file_to_upload'] ['error'] = $ this-> upload-> display_errors ('', ''); '). Las comillas simples son necesarias dentro de '$ this-> upload-> display_errors() para eliminar las'

'envolturas que normalmente se agregan mediante' display_errors() '. –

9

que tenían el mismo problema. Creé un formulario de contacto que permite al usuario subir un avatar y editar otra información al mismo tiempo. Los errores de validación de formulario se muestran por separado para cada campo. No podía pagar un esquema de visualización diferente para la entrada del archivo y los demás: tengo un método estándar que se encarga de mostrar los errores.

Utilicé una propiedad definida por el controlador y una función de validación de devolución de llamada para combinar cualquier error de carga con los de validación de formulario.

Aquí es un extracto de mi código:

# controller property 

private $custom_errors = array(); 

# form action controller method 

public function contact_save() 
{ 
    # file upload for contact avatar 

    $this->load->library('upload', array(
     'allowed_types'=>'gif|jpg|jpeg|png', 
     'max_size'=>'512' 
    )); 

    if(isset($_FILES['avatar']['size']) && $_FILES['avatar']['size']>0) 
    { 
     if($this->upload->do_upload('avatar')) 
     {   
      # avatar saving code here 

      # ... 
     } 
     else 
     { 
      # store any upload error for later retrieval 
      $this->custom_errors['avatar'] = $this->upload->display_errors('', ''); 
     } 
    } 

    $this->form_validation->set_rules(array(
     array(
      'field' => 'avatar', 
      'label' => 'avatar', 
      'rules' => 'callback_check_avatar_error' 
     ) 
     # other validations rules here 
    ); 

    # usual form validation here 

    if ($this->form_validation->run() == FALSE) 
    { 
     # display form with errors 
    } 
    else 
    { 
     # update and confirm 
    } 

} 

# the callback method that does the 'merge' 

public function check_avatar_error($str) 
{ 
    #unused $str 

    if(isset($this->custom_errors['avatar'])) 
    { 
     $this->form_validation->set_message('check_avatar_error', $this->custom_errors['avatar']); 
     return FALSE; 
    } 
    return TRUE; 
} 

Nota: como el archivo de entrada no va a repoblar si hay algún error en los otros campos de formulario, en caso de éxito de subida, almaceno y actualizarlo antes de cualquier se realiza otra validación, por lo que el usuario no necesita volver a seleccionar el archivo. Mi notificación es un poco diferente si esto sucede.

+2

Ese es un buen truco con la matriz $ _FILES. Como alternativa a su enfoque, moví la comprobación de la matriz de archivos a la devolución de llamada de validación para poder ejecutarla con mis otras validaciones. –

Cuestiones relacionadas