web-dev-qa-db-fra.com

Validation du téléchargement de fichier dans Codeigniter

J'essaie de valider le téléchargement de fichier pour le téléchargement d'image, mais il ne reçoit pas la validation comme les autres champs. J'utilise le processus Form_Validation.php pour la validation.

Tableau de téléchargement d'image:

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

quand j'essaie de télécharger l'image, elle ne répond pas comme il est requis, etc. Je souhaite également la valider pour .jpgetc et "comment définir la valeur du fichier sur un fichier incorrect comme au lieu de .jpg nous essayons de télécharger le .pdf" définir la valeur du champ de saisie set_value('field name') etc.

J'ai vérifié beaucoup de questions et j'ai aussi essayé d'utiliser la méthode call, mais je n'ai pas réussi à la résoudre.

UPDATE:

Veuillez fournir une réponse détaillée avec un exemple de code. Veuillez utiliser la méthode form_validation.php dans l'exemple et fournir également l'exemple de code de rappel, afin que je puisse lire/apprendre et le modifier en conséquence.

MISE À JOUR 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);

        }
    }

J'utilise déjà la classe de téléchargement de CI, mais cela ne fonctionne pas. Je souhaite maintenant valider l'image/le fichier à partir du côté formulaire_validation.

7
msz

J'ai écrit un exemple complet pour votre problème, j'espère que cela vous aidera. Dans le code suivant, j'utilise les rappels de validation de formulaire et les messages d'erreur personnalisés de validation de formulaire de CI.

Contrôleur: Front.php

la classe Front étend 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;
}

}

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

Dans l'exemple ci-dessus, je valide d'abord les name et email et pour l'image, j'appelle la fonction validate_image pour la valider, car la bibliothèque form_validation ne fournit pas de validation d'image, mais j'ai des rappels pour effectuer des validations personnalisées, le validate_image vérifie alors le type de contenu de l'image vérifiez la taille du fichier image, puis vérifiez l'extension de l'image si l'une de ces exigences n'est pas remplie, un message d'erreur sera défini pour chaque exigence à l'aide de la fonction set_message() de la bibliothèque form_validation.

4
Muhammad

Actuellement, vous ne recevez pas d'erreur car vous avez défini des règles de validation, vous avez également initialisé la configuration, mais après le téléchargement de la classe, vous ne vérifiez pas que le fichier est en cours de téléchargement ou qu'il y a des erreurs.

S'il vous plaît vérifier ci-dessous la solution mentionnée, cela vous aidera à résoudre ce problème.

Mise à jour 1:

Pour appeler un groupe spécifique, vous passerez son nom à la méthode $this->form_validation->run('task'). Je ne peux voir aucun tableau $config['task'] dans votre code. S'il vous plaît vérifier mon code mentionné ci-dessous et mettre à jour en fonction de votre 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);
        }
    }
}

Faites-moi savoir si cela ne fonctionne pas.

3
Shyam Shingadiya

Ici, je n’écris que des exemples de fichiers uploadés. Changez-le en fonction de vos besoins. controller/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;
    }
}
}
?>

view/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>
2
Gopalakrishnan

Essaye ça

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>
2
tushar tyagi

J'utilise ce code pour télécharger plusieurs images. Maintenant, essayez ci-dessous le code, espérons que cela vous aidera.

 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);
                        }
                    }
                }
            }
        }
    }
2
er.irfankhan11

Que diriez-vous de Classe de téléchargement de fichier de CI?

Les validations sont également disponibles auprès de la classe:

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

Le lien comprend le formulaire de téléchargement, la page Succès et le contrôleur.

Suivez simplement les instructions à partir de là et vous ne serez jamais perdu.

2
Jorz

Vous n'obtenez pas d'erreur en utilisant la classe de téléchargement CI, car vous n'appelez pas d'erreur de lecture de celle-ci. Changez votre code de mise à jour 2 comme ci-dessous

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



    }
}

En vue

echo (isset($error))?$error:"";
1
B. Desai