Intereting Posts
Это регулярное выражение отключает последнее слово в строке, хотя strlen находится в допустимом диапазоне open_basedir, File () не находится в допустимом пути Как преобразовать эти координаты в читаемые координаты карты Google? Симплекс XPath странности Установлен флажок PHP для проверки на основе значения базы данных Проблема с PEAR-каталогом в Windows Как загрузить язык с помощью gettext в PHP? Opencart: Ajax json ответ неизвестных персонажей Назначить значение javascript переменной php Значения массива PHP по умолчанию, если ключ не существует? PHP: Как скрыть / отобразить куски HTML Laravel Eloquent – использование идентификатора сводной таблицы в качестве внешнего ключа в другой таблице Найти всю строку, содержащую слово с регулярными выражениями php Запросите отношение ManyToMany и покажите хороший результат в Symfony с Doctrine Предотвращение прямого доступа к странице PHP

CodeIgniter – Требуется подтверждение загрузки файла

У меня есть 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(); } } } } 

Solutions Collecting From Web of "CodeIgniter – Требуется подтверждение загрузки файла"

Я нашел решение, которое работает именно так, как я хочу.

Я изменился

 $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; } 
  1. установить правило для проверки имени файла (если форма является многочастной)

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

  2. перезапишите массив $_POST следующим образом:

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

  3. а затем выполните:

    $this->form_validation->run()