2012-09-05 17 views
26

Ich habe 2 Textfelder und 1 Datei-Upload, die alle erforderlich sind. Alles funktioniert, wenn ich nur die Textfelder benötige, aber wenn ich den Datei-Upload benötige, bleibt der Validierungsfehler bestehen, dass eine Datei benötigt wird, obwohl ich eine ausgewählt habe. Wer weiß, was ich falsch mache? Vielen Dank im Voraus.CodeIgniter - Dateiupload erforderlich Validierung

// Ansicht

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

// Controller

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

ich einen Verbesserungsvorschlag haben, besser zu Ihrem HTML einfügen. – Red

+0

Okay, ich habe die HTML hinzugefügt, es ist sehr einfach, aber nicht sicher, ob es helfen wird. – Staysee

+0

Es könnte sein, dass Sie versucht haben, eine Datei hochzuladen, die zu groß ist. Versuchen Sie, eine kleinere Datei hochzuladen, wenn es funktioniert, dann werden Sie wahrscheinlich die Einstellungen in 'php.ini' ändern wollen, damit Sie größere Dateien hochladen können. Auch, wenn Sie diese wirklich schnell debuggen möchten, schlage ich vor, dass Sie eine 'var_dump()' auf der '$ _FILES' superglobal machen und sehen, was der Fehlercode des Datei-Uploads ist. –

Antwort

55

Ich habe eine Lösung gefunden, die genau so funktioniert, wie ich es möchte.

Ich änderte

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

Um

$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

Haben Sie versucht, den Dateityp zu validieren? –

5

Überprüfung dieses Formular-Validierung Erweiterungsbibliothek können Ihnen helfen, Dateien zu validieren, mit aktuellem Validierungsformular, wenn Sie Upload-Feld zu validieren als Eingabe behandeln abgelegt, wo Wert ist leer haben Sie auf diese wirklich gute Erweiterung für Formularvalidierung Bibliothek

MY_Formvalidation

6

CodeIgniter Datei-Upload optional ... funktioniert perfekt ..... :)

----- ----- Regler ---------

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

ich gerade diese Zeilen verwenden, die es optional macht,

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

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

Sie können es nicht erforderlich machen, indem $_FILES['userfile']['error'] != 4 verwendet wird, dann wird es diesen Fehler für Datei erforderlich geben und arbeitet gut mit anderen Arten von Fehlern, wenn ein durch mit return false, hoffen, dass es für u funktioniert ....

0

Sie sie durch zwingende die Funktion Ausführen von CI_Form_Validation

Kopie dieses func lösen kann in einer Klasse, die CI_Form_Validation erweitert.

Diese Funktion überschreibt die Elternklassenfunktion.Hier habe ich nur eine zusätzliche Überprüfung, die auch Datei verarbeiten kann

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

Sie Rückruf-Funktion nutzen können, wie diese

$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

funktioniert wie ein Charme. – jayz

0
  1. eine Regel den Dateinamen zu überprüfen (wenn die Form ist mehrt)

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

  2. o wie folgt verwrite der $_POST Array:

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

  3. und dann tun:

    $this->form_validation->run()

Verwandte Themen