У меня есть 2 текстовых поля и 1 загрузка файла, которые необходимы. Все работает, когда мне нужны только текстовые поля, но когда мне требуется загрузить файл, ошибка проверки остается, говоря, что требуется файл, хотя я выбрал его. Кто-нибудь знает, что я делаю неправильно? Спасибо заранее.
//Посмотреть
<?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(); } } } }
Я нашел решение, которое работает именно так, как я хочу.
Я изменился
$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'); }
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
используя $_FILES['userfile']['error'] != 4
, тогда он передаст эту ошибку для файла и будет отлично работать с другими типами ошибок, если таковые имеются, используя return false , надеюсь, что это работает для u ….
проверьте эту библиотеку расширения проверки формы, чтобы помочь вам проверить файлы, с текущей проверкой формы, когда вы проверяете поле загрузки, которое оно обрабатывает, в качестве входного файла, где значение пусто, посмотрите на это действительно хорошее расширение для библиотеки проверки формы
MY_Formvalidation
вы можете использовать функцию обратного вызова, например
$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; } }
вы можете решить это, переопределив функцию Run 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; }
установить правило для проверки имени файла (если форма является многочастной)
$this->form_validation->set_rules('upload_file[name]', 'Upload file', 'required', 'No upload image :(');
перезапишите массив $_POST
следующим образом:
$_POST['upload_file'] = $_FILES['upload_file']
а затем выполните:
$this->form_validation->run()