Проверка загрузки файлов в Codeigniter

Я пытаюсь проверить загрузку файла для загрузки изображений, но он не получает проверку, как другие поля. Я использую процесс Form_Validation.php для проверки.

Массив загрузки изображений:

 array( 'field'=>'image', 'label' => 'Image', 'rules' => 'required' ) 

когда я пытаюсь загрузить изображение, он не ответил так, как требуется, и т. д. Я также хочу проверить его на .jpg т. д. и «как установить значение файла в неправильном файле, а не .jpg мы пытаемся загрузить .pdf «как мы установили значение поля ввода set_value('field name') и т. д.

Я проверил множество вопросов, а также попытался использовать метод вызова, но не смог его исправить.

ОБНОВИТЬ:

Предоставьте подробный ответ с примером кода. Пожалуйста, используйте пример form_validation.php в примере, а также предоставите код примера обратного вызова, чтобы я мог читать / изучать и модифицировать его соответствующим образом.

ОБНОВЛЕНИЕ 2:

  public function Task() { if ($this->form_validation->run('Sub_Admin/task') == FALSE) { $this->data['Task'] = $this->bm->get_usr(); $data['title'] = "Add New Task"; $this->load->view('Subadmin/header',$data); $this->load->view('Subadmin/nav'); $this->load->view('Subadmin/sidebar'); $this->load->view('Subadmin/task', $this->data); $this->load->view('Subadmin/footer'); } else { $config['upload_path'] = './taskimages/'; //The path where the image will be save $config['allowed_types'] = 'gif|jpg|png'; //Images extensions accepted $config['max_size'] ='10048'; //The max size of the image in kb's //$config['max_width'] = '1024'; //The max of the images width in px //$config['max_height'] = '768'; //The max of the images height in px $config['overwrite'] = FALSE; //If exists an image with the same name it will overwrite. Set to false if don't want to overwrite $this->load->library('upload', $config); //Load the upload CI library $this->load->initialize($config); $this->upload->do_upload('task'); $file_info = $this->upload->data(); $file_name = $file_info['file_name']; $data = array( 'Job_Title' => $this->input->post('jtitle'), 'Priority' => $this->input->post('jnature'), 'Assignee' => $this->input->post('assigne'), 'Employee_Name' => $this->input->post('assignto'), 'Due_Date' => $this->input->post('ddate'), 'Reminder' => $this->input->post('reminder'), 'Task_Image' => $file_name, ); $this->bm->add_task($data); } } 

Я уже использую класс загрузки CI, но он не работает, и теперь я хочу проверить изображение / файл со стороны form_validation.

Я написал полный пример вашей проблемы, надеюсь, это поможет. В следующем коде я использую обратные вызовы проверки подлинности формы CI и пользовательские сообщения об ошибках формы.

Контроллер: Front.php

класс Front расширяет CI_Controller {

 public function index() { $this->load->view('form'); } public function upload_image() { $this->load->library('form_validation'); if ($this->form_validation->run('user_data') == FALSE) { $this->load->view('form'); } else { echo 'You form Submitted Successfully '; } } public function validate_image() { $check = TRUE; if ((!isset($_FILES['my_image'])) || $_FILES['my_image']['size'] == 0) { $this->form_validation->set_message('validate_image', 'The {field} field is required'); $check = FALSE; } else if (isset($_FILES['my_image']) && $_FILES['my_image']['size'] != 0) { $allowedExts = array("gif", "jpeg", "jpg", "png", "JPG", "JPEG", "GIF", "PNG"); $allowedTypes = array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF); $extension = pathinfo($_FILES["my_image"]["name"], PATHINFO_EXTENSION); $detectedType = exif_imagetype($_FILES['my_image']['tmp_name']); $type = $_FILES['my_image']['type']; if (!in_array($detectedType, $allowedTypes)) { $this->form_validation->set_message('validate_image', 'Invalid Image Content!'); $check = FALSE; } if(filesize($_FILES['my_image']['tmp_name']) > 2000000) { $this->form_validation->set_message('validate_image', 'The Image file size shoud not exceed 20MB!'); $check = FALSE; } if(!in_array($extension, $allowedExts)) { $this->form_validation->set_message('validate_image', "Invalid file extension {$extension}"); $check = FALSE; } } return $check; } 

}

Просмотр: form.php

 <!DOCTYPE html> <html> <head> <title>Image Upload</title> </head> <body> <h1><a href="<?= base_url() ?>">Form</a></h1> <?php if(!empty(validation_errors())): ?> <p><?= validation_errors() ?></p> <?php endif; ?> <?= form_open('front/upload_image', ['enctype' => "multipart/form-data"]) ?> <label>Name: </label><input type="text" name="name" value="<?= set_value('name') ?>"></label> <label>E-mail: </label><input type="email" name="email" value="<?= set_value('email') ?>"></label> <input type="file" name="my_image"> <button type="submit">Submit</button> <?= form_close() ?> </body> </html> 

form_validation.php

 $config = array( 'user_data' => array( array( 'field' => 'name', 'label' => 'Name', 'rules' => 'trim|required' ), array( 'field' => 'email', 'label' => 'Email', 'rules' => 'trim|required|valid_email' ), array( 'field' => 'my_image', 'label' => 'Image', 'rules' => 'callback_validate_image' ) ) ); 

В приведенном выше примере сначала я проверяю name и email а для изображения я вызываю функцию validate_image для его проверки, так как библиотека form_validation не обеспечивает проверку изображения, но у меня есть обратные вызовы для выполнения выборочных проверок, validate_image будет проверять тип содержимого изображения, затем проверьте размер файла изображения, а затем проверьте расширение изображения, если какое-либо из этих требований не выполняется, оно будет устанавливать сообщение об ошибке для каждого требования, используя set_message() библиотеки form_validation .

В настоящее время вы не получаете ошибку, потому что вы устанавливаете правила проверки, вы также инициализировали конфигурацию, но после загрузки класса вы не проверяете, загружен ли файл или какие ошибки.

Пожалуйста, проверьте ниже упомянутое решение, это поможет вам исправить это.

Обновление 1:

Чтобы вызвать определенную группу, вы передадите свое имя $this->form_validation->run('task') . Я не вижу массив $config['task'] в вашем коде. Пожалуйста, проверьте мой приведенный ниже код и обновите его на основе ваших inputs .

 public function Task() { $config = array( 'task' => array( array( 'field' => 'username', 'label' => 'Username', 'rules' => 'required' ), array( 'field' => 'email', 'label' => 'Email', 'rules' => 'required' ) )); $this->load->library('form_validation'); if ($this->form_validation->run('task') == FALSE) { $this->data['Task'] = $this->bm->get_usr(); $data['title'] = "Add New Task"; $this->load->view('Subadmin/header', $data); $this->load->view('Subadmin/nav'); $this->load->view('Subadmin/sidebar'); $this->load->view('Subadmin/task', $this->data); $this->load->view('Subadmin/footer'); } else { $fconfig['upload_path'] = './taskimages/'; $fconfig['allowed_types'] = 'gif|jpg|png'; $fconfig['max_size'] = '10048'; $fconfig['overwrite'] = FALSE; $this->load->library('upload', $fconfig); //Load the upload CI library $this->load->initialize($fconfig); if (!$this->upload->do_upload('my_image')) { $error = array('error' => $this->upload->display_errors()); $this->load->view('form' ,$error); } else { $file_info = $this->upload->data(); $file_name = $file_info['my_image']; $data = array( 'Job_Title' => $this->input->post('jtitle'), 'Priority' => $this->input->post('jnature'), 'Assignee' => $this->input->post('assigne'), 'Employee_Name' => $this->input->post('assignto'), 'Due_Date' => $this->input->post('ddate'), 'Reminder' => $this->input->post('reminder'), 'Task_Image' => $file_name, ); $this->bm->add_task($data); $data['upload_data'] = array('upload_data' => $this->upload->data()); $this->load->view('YOUR_SUCCESS_VIEW PAGE', $data); } } } 

Дайте мне знать, если это не сработает.

Как насчет загрузки файлов из CI?

Валидации также доступны из класса:

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

Ссылка включает в себя форму загрузки, страницу успеха и контроллер.

Просто следуйте инструкциям оттуда, и вы никогда не заблудитесь.

Я использую этот код для загрузки нескольких изображений. Теперь попробуйте под кодом, надеюсь, это поможет.

  public function __construct(){ parent::__construct(); $this->load->helper('date'); $this->load->helper('url'); $this->load->helper('form'); $this->load->helper('html'); $this->load->library('form_validation'); $this->load->library('email'); $this->form_validation->set_error_delimiters('', ''); $config['allowed_types'] = 'jpeg|jpg|png|bmp'; $this->load->library('upload', $config); $this->load->library('session'); } public function Task() { if ($this->form_validation->run('Sub_Admin/task') == FALSE) { $this->data['Task'] = $this->bm->get_usr(); $data['title'] = "Add New Task"; $this->load->view('Subadmin/header',$data); $this->load->view('Subadmin/nav'); $this->load->view('Subadmin/sidebar'); $this->load->view('Subadmin/task', $this->data); $this->load->view('Subadmin/footer'); } else { $filesCount = count($_FILES['file']['name']); $result = ''; if($filesCount > 0) { $event_id = trim($this->input->post('event_name')); for($i = 0; $i < $filesCount; $i++) { $_FILES['gallery']['name'] = $_FILES['file']['name'][$i]; $_FILES['gallery']['type'] = $_FILES['file']['type'][$i]; $_FILES['gallery']['tmp_name'] = $_FILES['file']['tmp_name'][$i]; $_FILES['gallery']['error'] = $_FILES['file']['error'][$i]; $_FILES['gallery']['size'] = $_FILES['file']['size'][$i]; $image = $_FILES['gallery']['name']; $directoryPath = date('Y/M/'); $path_info = pathinfo($image); //check file type valid or not if(in_array($path_info['extension'], array('jpg', 'jpeg','png', 'gif','JPG','JPEG'))){ // Upload job picture $random = time(); $config['upload_path'] = './taskimages/'; $config['allowed_types'] = 'jpg|png|jpeg|bmp'; $config['file_name'] = $random; $config['encrypt_name'] = TRUE; $config['max_size'] = '250000000'; $config['max_width'] = '75000000'; $config['max_height'] = '7500000'; $this->load->library('upload', $config); $this->upload->initialize($config); ini_set('upload_max_filesize', '10M'); ini_set('memory_limit', '-1'); if ($this->upload->do_upload('gallery')) { $imageArray = $this->upload->data(); $image_name = $imageArray['raw_name'] . '' . $imageArray['file_ext']; // Job Attachment $config1['image_library'] = 'gd2'; $config1['source_image'] = './taskimages/' . $image_name; $config1['create_thumb'] = TRUE; $config1['maintain_ratio'] = TRUE; $config1['width'] = 620; $config1['height'] = 540; $this->load->library('image_lib', $config); $this->image_lib->initialize($config1); $this->image_lib->resize(); $this->image_lib->clear(); $file_name = $image_name_thumb = $imageArray['raw_name'] . '_thumb' . $imageArray['file_ext']; $data = array( 'Job_Title' => $this->input->post('jtitle'), 'Priority' => $this->input->post('jnature'), 'Assignee' => $this->input->post('assigne'), 'Employee_Name' => $this->input->post('assignto'), 'Due_Date' => $this->input->post('ddate'), 'Reminder' => $this->input->post('reminder'), 'Task_Image' => $file_name, ); $this->bm->add_task($data); } } } } } } 

Здесь я пишу только загрузку пробных файлов. Измените его в соответствии с вашим требованием. Контроллер / Files.php

 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class Files extends CI_Controller { function __construct() { parent::__construct(); } public function upload(){ $data = array(); $this->load->library('form_validation'); $this->load->helper('file'); $this->form_validation->set_rules('task', '', 'callback_file_check'); if($this->form_validation->run() == true){ //upload configuration $config['upload_path'] = 'uploads/files/'; $config['allowed_types'] = 'gif|jpg|png|pdf'; $config['max_size'] = 1024; $this->load->library('upload', $config); //upload file to directory if($this->upload->do_upload('task')){ //YOU CAN DO WHAT DO THE PROCESS }else{ $data['error_msg'] = $this->upload->display_errors(); } } //load the view $this->load->view('upload_view', $data); } public function file_check($str){ $allowed_mime_type_arr = array('application/pdf','image/gif','image/jpeg','image/pjpeg','image/png','image/x-png'); //HERE you CAN GIVE VALID FILE EXTENSION $mime = get_mime_by_extension($_FILES['task']['name']); if(isset($_FILES['task']['name']) && $_FILES['task']['name']!=""){ if(in_array($mime, $allowed_mime_type_arr)){ return true; }else{ $this->form_validation->set_message('file_check', 'Please select only pdf/gif/jpg/png file.'); return false; } }else{ $this->form_validation->set_message('file_check', 'Please choose a file to upload.'); return false; } } } ?> 

Вид / upload_view.php

 <?php if(!empty($success_msg)){ echo '<p class="statusMsg">'.$success_msg.'</p>'; }elseif(!empty($error_msg)){ echo '<p class="statusMsg">'.$error_msg.'</p>'; } ?> <form method="post" enctype="multipart/form-data" action="<?php echo base_url(); ?>files/upload"> <p><input type="task" name="task"/></p> <?php echo form_error('task','<p class="help-block">','</p>'); ?> <p><input type="submit" name="uploadFile" value="UPLOAD"/></p> </form> 

Попробуй это

 public function add_partner() { $config =[ 'upload_path' => './uploads_image', 'allowed_types' => 'jpg|gif|png|jpeg',//Image allowed Type ]; $this->load->library('upload',$config);//load image liabrary $post=$this->input->post(); if($this->form_validation->run('partner') && $this->upload- >do_upload('userfile')) { $data = $this->upload->data(); $image_path = ("uploads_image/" .$data['raw_name'] . $data['file_ext']); $post['partner_image'] = $image_path; //partner_image tabelfield name unset($post['submit']); $this->partner_model->add_partner($post);//data to model } else { $upload_error= $this->upload->display_errors(); $this->load->view('admin/add_partner',['upload_error'=>$upload_error]); } } In view <div class="row"> <div class="col-lg-8"> <div class="form-group"> <label for="image" class="col-lg-5 control-label"> Upload Image<span style="color:red;">*</span></label> <div class="col-lg-7"> <?php echo form_upload(['name'=>'userfile','class'=>'form-control','data-max-size'=>' 2048','value'=>set_value('userfile')]); ?> </div> </div> </div> <div class="col-lg-4"> <?php if(isset($upload_error)) echo $upload_error; ?> </div> </div> с public function add_partner() { $config =[ 'upload_path' => './uploads_image', 'allowed_types' => 'jpg|gif|png|jpeg',//Image allowed Type ]; $this->load->library('upload',$config);//load image liabrary $post=$this->input->post(); if($this->form_validation->run('partner') && $this->upload- >do_upload('userfile')) { $data = $this->upload->data(); $image_path = ("uploads_image/" .$data['raw_name'] . $data['file_ext']); $post['partner_image'] = $image_path; //partner_image tabelfield name unset($post['submit']); $this->partner_model->add_partner($post);//data to model } else { $upload_error= $this->upload->display_errors(); $this->load->view('admin/add_partner',['upload_error'=>$upload_error]); } } In view <div class="row"> <div class="col-lg-8"> <div class="form-group"> <label for="image" class="col-lg-5 control-label"> Upload Image<span style="color:red;">*</span></label> <div class="col-lg-7"> <?php echo form_upload(['name'=>'userfile','class'=>'form-control','data-max-size'=>' 2048','value'=>set_value('userfile')]); ?> </div> </div> </div> <div class="col-lg-4"> <?php if(isset($upload_error)) echo $upload_error; ?> </div> </div> 

Вы не получаете ошибку, используя класс загрузки CI, потому что вы не вызываете ошибку. Измените код обновления 2 следующим образом

 public function Task() { if ($this->form_validation->run('Sub_Admin/task') == FALSE) { $this->data['Task'] = $this->bm->get_usr(); $data['title'] = "Add New Task"; $this->load->view('Subadmin/header',$data); $this->load->view('Subadmin/nav'); $this->load->view('Subadmin/sidebar'); $this->load->view('Subadmin/task', $this->data); $this->load->view('Subadmin/footer'); } else { $config['upload_path'] = './taskimages/'; //The path where the image will be save $config['allowed_types'] = 'gif|jpg|png'; //Images extensions accepted $config['max_size'] ='10048'; //The max size of the image in kb's //$config['max_width'] = '1024'; //The max of the images width in px //$config['max_height'] = '768'; //The max of the images height in px $config['overwrite'] = FALSE; //If exists an image with the same name it will overwrite. Set to false if don't want to overwrite $this->load->library('upload', $config); //Load the upload CI library $this->load->initialize($config); if ( ! $this->upload->do_upload('task')) { $upload_error = $this->upload->display_errors(); //Here you will get errors. You can handle with your own way echo $upload_error; //<------------you can echo it for debugging purpose $data['error'] = $upload_error; //<-------------you can send it in view to display error in view. $this->load->view('your_view' ,$data); //<---pass data to view } else { $file_info = $this->upload->data(); $file_name = $file_info['file_name']; $data = array( 'Job_Title' => $this->input->post('jtitle'), 'Priority' => $this->input->post('jnature'), 'Assignee' => $this->input->post('assigne'), 'Employee_Name' => $this->input->post('assignto'), 'Due_Date' => $this->input->post('ddate'), 'Reminder' => $this->input->post('reminder'), 'Task_Image' => $file_name, ); $this->bm->add_task($data); } } } 

Ввиду

 echo (isset($error))?$error:"";