CodeIgniter 3第496行的..system/librarys/Upload.php中不支持的操作数类型


CodeIgniter 3 Unsupported operand types in...system/libraries/Upload.php on line 496

我正在通过ajax(老派,而不是Jquery)开发多文件上传。事实上,我终于设法让它发挥了作用。问题是,我不得不在System/Library/Upload文件中注释掉一行,这听起来不像是解决问题的推荐方法。

在取消注释该行的情况下,如果我输出upload->display_errors(),我会得到一条Unsupported operand types in...system/libraries/Upload.php on line 496错误消息。

系统/库/上传的第496行为:

// Convert the file size to kilobytes
    if ($this->file_size > 0)
    {
        $this->file_size = round($this->file_size/1024, 2);// <- this line
    }

如果我这样评论这行,我不会得到错误,并且文件上传正确:

// Convert the file size to kilobytes
    if ($this->file_size > 0)
    {
        //$this->file_size = round($this->file_size/1024, 2);
    }

这是我的基本控制器,名为"Uploader",以免与CI的Library->Upload混淆(我复制了这个类,出于某种原因,作者决定将他的类命名为"Upload",还决定将函数命名为"do_Upload",这有点混淆,因为这是CodeIgniter用于其上传类和do_uploard函数的名称)。正如您所看到的,我注释掉了$config数组中的max_size参数:

class Uploader extends CI_Controller {
function __construct()
    {
            parent::__construct();
    }
private $data = array();
private $params = array();

public function index()
{
    echo "This is the index!";
}

    public function do_upload()
    {
        echo "<p>upload controller:</p>";
        $config = $this->set_upload_options();
        $this->load->library('upload',$config);
        echo "<pre>";
        print_r($_FILES);
        $files = $_FILES;
        $cpt = count($_FILES['photos']['name']);
        $data = array();
        $photos = "photos";
        for($i=0; $i<$cpt; $i++)
        {           
            $_FILES['photos']['name']= $files['photos']['name'][$i];
            $_FILES['photos']['type']= $files['photos']['type'][$i];
            $_FILES['photos']['tmp_name']= $files['photos']['tmp_name'][$i];
            $_FILES['photos']['error']= $files['photos']['error'][$i];
            $this->upload->initialize($config);
            if (!$this->upload->do_upload($photos)) {
                $error = array('error' => $this->upload->display_errors());
                foreach($error as $err)
                {
                    echo "<p>".$err."</p>";
                }
            }
        }
        $data['count'] = $i;
        echo $data['count'];
        return $data;
    }
    private function set_upload_options()
    {   
        //upload an image options
        $config = array();
        $config['upload_path']   = FCPATH . 'assets_/images/assets/experimental/';
        $config['allowed_types'] = 'gif|jpg|png';
        //$config['max_size']      = '0';
        $config['overwrite']     = TRUE;
        return $config;
    }

}

我应该让睡觉的狗躺着吗?还是我只是用胶带封住了一个可能会反噬我的问题?

更新:在尝试输出一些`$this->file_size()之后,我发现它是作为数组传递的,所以数组自然不能是操作数。

目前,我将系统->库->上传文件中的if块更改为this,For循环根据循环中迭代的$this->file_size[$I]分配新的$this->file_size。这可能是答案,但在回答我自己的问题之前,我会等待其他人的贡献:

        // Convert the file size to kilobytes
    if ($this->file_size > 0)
    {
                if(is_array($this->file_size)){
                    for($i=0;$i<count($this->file_size);$i++)
                    {
                        $this->file_size[$i] = round( $this->file_size[$i] / 1024, 2 );
                    }
                }else{
                    $this->file_size = round($this->file_size/1024, 2);
                }
    }

我知道问题发生的原因,也知道该怎么解决。在我描述的第一句话"多文件上传"中就暗示了这个问题。

正如我已经指出的,"不支持的操作数"正是file_size,它是一个数组,而不是一个简单的整数。它是如何成为一个数组的呢?

你看,$_FILES对象变成了一个数组数组,因为我上传的是多个图片文件,而不是单个文件,所以一个数组而不是一个简单的整数被传递到System->Libraries->Upload类,第494到497行,

if ($this->file_size > 0)
{
      $this->file_size = round($this->file_size/1024, 2);
}

$this->file_size变成了一个数组,这意味着它不再是一个简单的操作数$此->file_size是不受支持的操作数!

当然,我们不能满足于"好吧,我想你不应该同时上传多个文件。"我们需要被允许一次上传多个档案。这是一项要求。

我尝试在for循环中移动$this->upload->initialize($this->set_upload_options());行,以便为每个文件设置upload$config,但我仍然收到这个错误。我相信还有一个更优雅的解决方案,但目前修改System/Libraries/Upload.php中第494行开始的if块似乎是防弹的:

    if ($this->file_size > 0)
    {
                if(is_array($this->file_size)){
                    for($i=0;$i<count($this->file_size);$i++)
                    {
                        $this->file_size[$i] = round( $this->file_size[$i] / 1024, 2 );
                    }
                }else{
                    $this->file_size = round($this->file_size/1024, 2);
                }
    }

现在,您可以传递一个简单的file_size,甚至一个file_size作为数组(因为您尝试上传多个文件),这样就可以了。

确保$config数组看起来像这样,其中$config['max_size'] = 0;中的0而不是$config['max_size'] = '0';

        private function set_upload_options()
    {   
        //upload an image options
        $config = array();
        $config['upload_path']   = FCPATH . 'assets_/images/assets/experimental/';
        $config['allowed_types'] = 'gif|jpg|png';
        $config['max_size']      = 0;
        $config['overwrite']     = TRUE;
        return $config;
    }

显然,如果它是"0"而不是"0",则无法正确评估它。

请检查system''core''Common.php

function &get_mimes()
    {
        static $_mimes;
        if (empty($_mimes))
        {
            if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'))
            {
                $_mimes = include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php');
            }
            elseif (file_exists(APPPATH.'config/mimes.php'))
            {
                $_mimes = include(APPPATH.'config/mimes.php');
            }
            else
            {
                $_mimes = array();
            }
        }
        return $_mimes;
    }

请根据codeigniter环境(开发/生产)检查您的mimes.php(在config文件夹中)。您应该在您的环境文件夹(开发/生产)中移动mimes.php。