Validação de upload de arquivo no Codeigniter

Estou tentando validar o upload de arquivos para upload de imagens, mas não está obtendo a validação como outros campos. Estou usando o processo Form_Validation.php para validação.

Arranjo de upload de imagens:

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

Quando eu tento carregar a imagem, não respondeu, como é necessário, etc. Eu também quero validá-la para .jpg etc e “como definir o valor do arquivo em arquivo incorreto como em vez de .jpg tentamos carregar o .pdf “como definimos o valor do campo de input set_value('field name') etc.

Verifiquei muitas perguntas e também tentei usar o método de chamada, mas não consegui corrigi-lo.

ATUALIZAR:

Forneça uma resposta detalhada com o exemplo do código. Use a forma form_validation.php no exemplo e também forneça o código de exemplo de retorno de chamada, para que eu possa ler / aprender e modificá-lo de acordo.

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

Eu já estou usando a class de upload da CI, mas não está funcionando, e agora eu quero validar a imagem / arquivo do lado da forma_validação.

Eu escrevi um exemplo completo para o seu problema, espero que ele ajude. No código a seguir, estou usando o retorno de chamada de validação de formulário CI e as Mensagens de erro personalizadas de validação de formulário.

Controlador: Front.php

class Front extends 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; } 

}

Ver: form.php

    Image Upload   

Form

"multipart/form-data"]) ?>

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

No exemplo acima, estou validando o name e o e- email e para a Imagem. Estou chamando a function validate_image para validá-lo, uma vez que a biblioteca form_validation não fornece a validação de imagem, mas eu tenho retorno de chamada para fazer validações personalizadas, a validate_image verificará o tipo de conteúdo da imagem, então verifique o tamanho do arquivo da imagem e, em seguida, verifique a extensão da imagem se qualquer um desses requisitos não for cumprido, ele configurará a mensagem de erro para cada requisito usando a function set_message() da biblioteca form_validation .

Atualmente você não está obtendo erro porque você define as regras de validação, você também configurou a configuração, mas depois de fazer o upload da class, você não verifica se nenhum dos arquivos está sendo carregado ou erros.

Por favor, verifique a solução abaixo mencionada, ela irá ajudá-lo a corrigir isso.

Atualização 1:

Para chamar um grupo específico, você passará seu nome para o método $this->form_validation->run('task') . Não consigo ver nenhuma matriz $config['task'] em seu código. Verifique o código abaixo e atualize-se com base em suas 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); } } } 

Deixe-me saber se não funciona.

Como sobre a class de upload de arquivos da CI?

As validações também estão disponíveis na class:

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

O link inclui o formulário de upload, a página de sucesso e o controlador.

Basta seguir as instruções de lá e você nunca se perderá.

Estou usando este código para upload de imagens múltiplas. Agora tente código abaixo, espero que ajude.

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

Aqui eu escrevo apenas o upload de arquivos de amostra. Mude-o de acordo com sua exigência. controlador / Files.php

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

ver / upload_view.php

 '.$success_msg.'

'; }elseif(!empty($error_msg)){ echo '

'.$error_msg.'

'; } ?>

','

'); ?>

Experimente isso

 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 
'userfile','class'=>'form-control','data-max-size'=>' 2048','value'=>set_value('userfile')]); ?>

Você não está recebendo erro usando a class de upload da CI, porque você não está chamando o erro de metodos disso. Mude o código da atualização 2 conforme abaixo

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

Em vista

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