CodeIgniter - 表单验证和文件上传数据

Posted

技术标签:

【中文标题】CodeIgniter - 表单验证和文件上传数据【英文标题】:CodeIgniter - Form Validation and File Upload Data 【发布时间】:2011-07-07 20:07:35 【问题描述】:

我想知道是否有办法使用 CodeIgniter 2.0 中的表单验证类来验证文件的大小。我有一个包含文件输入的表单,我想做这样的事情:

$this->form_validation->set_rule('file', 'File', 
                 'file_type[image/jpeg|image/gif|image/png]|file_max_size[500]');

我考虑过扩展验证类以将其与上传类结合起来并根据上传数据进行验证,但这可能会很耗时。

有谁知道表单验证类的任何扩展可以做这样的事情吗?

【问题讨论】:

我通常首先验证表单,如果一切正常,我开始检查文件上传的有效性。 【参考方案1】:

文件上传类实际上有自己的一组验证规则,你可以这样设置

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

$this->load->library('upload', $config);

(taken from CI docs)

【讨论】:

如果文件不符合验证配置,是否会更新表单验证错误?例如,如果文件太大,validation_errors() 函数会弹出这样的错误信息吗? 不,您必须单独处理文件上传错误,所以首先我会检查输入字段验证,然后检查do_upload(),并且有一个专门显示上传验证错误的功能。这一切都在我在答案中链接到的文档中。 如果将上传字段添加到验证中,但不给它任何验证规则($this->form_validation->set_rules( 'file_to_upload', 'File To Upload', '' );),则可以将上传错误消息放入form_validation对象中,它会自动正常显示($this->form_validation->_field_data['file_to_upload']['error'] = $this->upload->display_errors( '', '' );)。 $this->upload->display_errors() to remove the

`通常由display_errors()添加的包装器中需要单引号。
【参考方案2】:

我遇到了同样的问题。我建立了一个联系表格,允许用户上传头像并同时编辑其他信息。每个字段分别显示表单验证错误。我无法为文件输入和其他输入提供不同的显示方案 - 我有一个标准方法来处理显示错误。

我使用控制器定义的属性和回调验证函数将任何上传错误与表单验证错误合并。

这是我的代码摘录:

# controller property

private $custom_errors = array();

# form action controller method

public function contact_save()

    # file upload for contact avatar

    $this->load->library('upload', array(
        'allowed_types'=>'gif|jpg|jpeg|png',
        'max_size'=>'512'
    ));

    if(isset($_FILES['avatar']['size']) && $_FILES['avatar']['size']>0)
    
        if($this->upload->do_upload('avatar'))
                   
            # avatar saving code here

            # ...
        
        else
        
            # store any upload error for later retrieval
            $this->custom_errors['avatar'] = $this->upload->display_errors('', '');
        
    

    $this->form_validation->set_rules(array(
        array(
            'field'   => 'avatar',
            'label'   => 'avatar',
            'rules'   => 'callback_check_avatar_error'
        )
        # other validations rules here
    );

    # usual form validation here

    if ($this->form_validation->run() == FALSE)
    
        # display form with errors
    
    else
    
        # update and confirm
    



# the callback method that does the 'merge'

public function check_avatar_error($str)

    #unused $str

    if(isset($this->custom_errors['avatar']))
    
        $this->form_validation->set_message('check_avatar_error', $this->custom_errors['avatar']);
        return FALSE;
    
    return TRUE;

注意:如果其他表单字段中存在任何错误,文件输入将不会重新填充,因此在上传成功后,我会在进行任何其他验证之前存储并更新它 - 因此用户无需重新选择文件。如果发生这种情况,我的通知会有所不同。

【讨论】:

这是 $_FILES 数组的一个好技巧。作为您的方法的替代方法,我将文件数组检查移动到验证回调中,以便我可以使用其他验证运行。

以上是关于CodeIgniter - 表单验证和文件上传数据的主要内容,如果未能解决你的问题,请参考以下文章

codeigniter 4 多文件验证

CodeIgniter - 文件上传需要验证

CodeIgniter文件上传验证ppt和pptx文件

在 Codeigniter 中填充表单数据和验证数据的更简单方法?

将表单文件附加到电子邮件,Codeigniter

Codeigniter 图片上传使用 jquery 和 ajax 错误 [重复]