【问题标题】:File Upload Validation In CodeigniterCodeigniter 中的文件上传验证
【发布时间】:2018-01-14 00:55:27
【问题描述】:

我正在尝试为图像上传验证文件上传,但它没有像其他字段一样获得验证。我正在使用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 端验证图像/文件。

【问题讨论】:

  • SO 不是编码服务(甚至不是赏金)。提供您迄今为止尝试过的内容以及您遇到的问题。
  • @msz 我已经根据你的问题更新了我的代码。
  • 我认为以下答案会对您有所帮助。 Click here

标签: php validation file-upload codeigniter-3


【解决方案1】:

CI 的File Uploading Class 怎么样?

也可以从类中获得验证:

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

该链接包括上传表单、成功页面和控制器。

只需按照那里的说明进行操作,您就不会迷路。

【讨论】:

  • 请检查 更新 2
【解决方案2】:

使用 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:"";

【讨论】:

  • 不工作....如果我选择 .pdf 并且它没有重置文件值/名称,则不会显示错误。
【解决方案3】:

目前您没有收到错误,因为您设置了验证规则,您还初始化了配置,但在上传类后,您没有检查文件是否正在上传或错误。

请检查下面提到的解决方案,它将帮助您解决此问题。

更新 1:

为了调用特定组,您将其名称传递给$this-&gt;form_validation-&gt;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);
        }
    }
}

如果它不起作用,请告诉我。

【讨论】:

  • 不工作....如果我选择 .pdf 并且它没有重置文件值/名称,则不会显示错误。
【解决方案4】:

我为您的问题写了一个完整的示例,希望对您有所帮助。在以下代码中,我使用 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'
                )
        )
);

在上面的示例中,我首先验证nameemail,对于图像我调用validate_image 函数来验证它,因为form_validation 库不提供图像验证,但我有回调来进行自定义验证,validate_image 将检查图像内容类型,然后检查图像文件大小,然后检查图像扩展名,如果不满足任何这些要求,它将使用set_message() 库的set_message() 函数为每个要求设置错误消息@ 库。

【讨论】:

  • 你能告诉我“如何设置图像的前一个值”就像我们为其他文本框等设置的那样&lt;?php echo set_value('task')?&gt;我试试这个但是当我提交表单时它显示错误但是值不会为它重置。
  • @msz 由于安全原因,无法设置文件箱的值,如果允许,则任何站点都可以从您的文件系统中窃取文件。所以浏览器不允许它在没有用户交互的情况下设置值。您可以使用 Ajax 表单上传,它将保留您的所有数据,直到您的服务器响应数据正常,您可以将用户重定向到成功页面或重置表单。
【解决方案5】:

我正在使用此代码上传多张图片。 现在试试下面的代码,希望它会有所帮助。

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

【讨论】:

    【解决方案6】:

    这里我只写示例文件上传。根据您的要求更改它。 控制器/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>
    

    【讨论】:

      【解决方案7】:

      试试这个

      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>
      

      【讨论】:

        【解决方案8】:

        在 CODEIGNITER 4 中,Validation 类包括文件验证功能。您可以通过以下代码块来实现它。

        在 Config/Validation.php 中添加

        public $signup = [
                'username' => [
                    'rules'  => 'required|alpha',
                    'errors' => [
                        'required' => 'You must choose a Username.'
                    ]
                ],
                'profile_image' => [
                    'rules' => 'uploaded[profile_image]|max_size[profile_image,1024]|ext_in[profile_image,png,jpg]|max_dims[profile_image,1000,1000]',
                    'label' => 'profile image'
                ]
            ];
        

        在您的控制器中添加以下代码

        public function register()
        {
            $validation =  \Config\Services::validation();
            if($this->request->getMethod() == 'post') {
                //$validation->setRuleGroup('signup');
                if (!$this->validate('signup')) {
                    //$validationErrors = $validation->getErrors();
                    echo view('register', [
                        'validation' => $validation
                    ]);
                }
                else
                {
                    // your logic goes here....
                    echo view('Success');
                }
            } else {
                echo view('register', [
                    'validation' => $validation
                ]);
            }
        }
        

        你的观点会是这样的

            <?= $validation->listErrors() ?>
        <?php echo form_open_multipart(); ?>
        <div class="row">
            <div class="col-md-4 offset-md-4">
                <label>Full Name</label><br/>
                <input type="text" name="username" class="form-control" size="50" value="<?php echo set_value('username'); ?>"/>
            </div>
        </div>
        <div class="row">
            <div class="col-md-4 offset-md-4">
                <label>Profile Picture</label><br/>
                <input type="file" name="profile_image" class="form-control" value="<?= set_value('profile_image') ?>"/>
            </div>
        </div>
        <div class="row">
            <div class="col-md-4 offset-md-4"><br/>
                <button class="btn btn-primary btn-block">Login</button>
            </div>
        </div>
        <?php echo form_close(); ?>
        

        【讨论】:

          猜你喜欢
          • 2012-08-30
          • 1970-01-01
          • 2012-09-08
          • 2015-03-12
          • 2013-06-27
          • 2011-07-07
          • 2012-05-09
          • 2015-01-28
          • 1970-01-01
          相关资源
          最近更新 更多