【问题标题】:How to prevent upload file when form validation false in codeigniter?当codeigniter中的表单验证错误时如何防止上传文件?
【发布时间】:2018-02-20 17:33:27
【问题描述】:

我正在使用 Codeigniter 3.x。当我的表单提交时,如果表单验证为 FALSE,我上传的文件保留在主机上,这是一个错误。我正在使用回调函数进行上传。感谢您的任何解决方案...

$this->form_validation->set_rules('file', 'lang:pic',callback_multiple_upload');

//The callback

    public function multiple_upload(){

        $this->load->library('upload');
        $number_of_files_uploaded = count($_FILES['file']['name']);
        // Faking upload calls to $_FILE
        for ($i = 0; $i < $number_of_files_uploaded; $i++){
            if(!$_FILES['file']['name'][$i])
                continue;
            $_FILES['file[]']['name']     = $_FILES['file']['name'][$i];
            $_FILES['file[]']['type']     = $_FILES['file']['type'][$i];
            $_FILES['file[]']['tmp_name'] = $_FILES['file']['tmp_name'][$i];
            $_FILES['file[]']['error']    = $_FILES['file']['error'][$i];
            $_FILES['file[]']['size']     = $_FILES['file']['size'][$i];

            $config = array(
                'allowed_types' => 'jpg|jpeg|png|gif',
                'encrypt_name'  => TRUE,
                'max_size'      => 200,
                'remove_spaces' => TRUE,
                'overwrite'     => FALSE,
                'upload_path'   => "./PATH/");
            $this->upload->initialize($config,TRUE);
            if($this->upload->do_upload("file[]")===FALSE){
                $error = $this->upload->display_errors();
                $this->form_validation->set_message('multiple_upload',$error);
                return FALSE;
            }
            else{
                $this->final_files_data[]=$this->upload->data();
            }
        }
        return TRUE;
    }

【问题讨论】:

  • 请发布您的表单验证码
  • 帖子已编辑,您现在可以看到代码了。
  • 如果它对你有帮助 roytuts.com/codeigniter-multiple-files-upload/
  • 表单验证回调用于验证而不是其他应用程序逻辑(例如上传)。想象一下,如果表单的其他元素评估为 false,文件将继续上传,直到用户提交有效的表单。回调将始终被调用。这乱七八糟的。对表单中的其他元素进行验证检查,然后再进行上传。如果那里有错误,则将这些错误发送给用户。不要尝试在表单验证中执行所有这些操作。

标签: php codeigniter


【解决方案1】:

只需检查验证检查是否返回 true。

if ($this->form_validation->run() == TRUE){
    //File uploading
} else {
    //Error message or redirection
}

【讨论】:

  • 我在回调函数中尝试了你的脚本 { $this->form_validation->run() } 并出现此错误 { 致命错误:最大函数嵌套级别 }。
  • 此错误消息专门来自 XDebug 扩展。 PHP 本身没有函数嵌套限制。更改 php.ini 中的设置:
  • xdebug.max_nesting_level = 200
  • 或在您的 PHP 代码中:ini_set('xdebug.max_nesting_level', 200);
  • 我设置了 1000 但有内存问题。我只有 3 个字段并收到内存限制警告。您的解决方案可能有效,但也会产生其他问题。我不知道@Morteza Mousavi 使用哪个主机,但大多数人使用共享主机。
【解决方案2】:

修改你的回调函数添加你的强制检查。

    public function multiple_upload()
   {
      if (isset($_POST['username'])) // validation checks 
      {
         $this->load->library('upload');
         $number_of_files_uploaded = count($_FILES['file']['name']);
         for ($i = 0; $i < $number_of_files_uploaded; $i++)
         {
            if (!$_FILES['file']['name'][$i])
               continue;
            $_FILES['file[]']['name'] = $_FILES['file']['name'][$i];
            $_FILES['file[]']['type'] = $_FILES['file']['type'][$i];
            $_FILES['file[]']['tmp_name'] = $_FILES['file']['tmp_name'][$i];
            $_FILES['file[]']['error'] = $_FILES['file']['error'][$i];
            $_FILES['file[]']['size'] = $_FILES['file']['size'][$i];

            $config = array(
               'allowed_types' => 'jpg|jpeg|png|gif',
               'encrypt_name' => TRUE,
               'max_size' => 200,
               'remove_spaces' => TRUE,
               'overwrite' => FALSE,
               'upload_path' => "./PATH/");
            $this->upload->initialize($config, TRUE);
            if ($this->upload->do_upload("file[]") === FALSE)
            {
               $error = $this->upload->display_errors();
               $this->form_validation->set_message('multiple_upload', $error);
               return FALSE;
            } else
            {
               $this->final_files_data[] = $this->upload->data();
            }
         }
         return TRUE;
      } else
      {
         return false;
      }
   }

【讨论】:

    猜你喜欢
    • 2016-10-03
    • 2012-09-08
    • 2022-11-22
    • 1970-01-01
    • 2011-07-07
    • 2012-05-09
    • 2019-09-20
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多