当前位置: 首页 > 知识库问答 >
问题:

CodeIgniter 3在第496行…system/libraries/upload.php中不支持操作数类型

宣高朗
2023-03-14

我正在开发一个通过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的库->upload混淆(我复制了这个类,出于某种原因,作者决定将他的类命名为“upload”,还决定将函数命名为“do_upload”,这有点混乱,因为这些是CodeIgniter用于其upload类和do_upload函数的名称)。如您所见,我注释掉了$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()之后,我发现它是作为数组传递的,所以自然数组不能是操作数。

现在,我将system->libraries->upload file中的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);
                }
    }

共有2个答案

华泽语
2023-03-14

请选中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移动到您的环境文件夹(Development/Production)中。

贡英华
2023-03-14

我知道问题发生的原因,也知道该怎么做来修复它。这个问题在我描述的第一句“多文件上传”中有所暗示。

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

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

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

$this->file_size变成一个数组,这意味着它不再是一个简单的操作数...$this->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,它就不会得到正确的评估。

 类似资料:
  • 我有以下代码。我知道它既长又复杂,但在我的笔记本电脑上运行需要1.5分钟。如果您能帮助我找到最后导致错误的问题-绘图部分,我将不胜感激。我在Google上没有找到与此错误消息相关的任何内容: QuadMesh和Float的不支持操作数类型 在绘图部分,我尝试了多种形式。它失败于: 在以下情况下失败: 我没有办法在那里介绍什么。 非常感谢。

  • 问题内容: 每当我运行这个程序我都会得到这个 我该怎么做才能将pyc除以tpy? 问题答案: 通过将它们变成整数: 在python 3中,该函数返回一个字符串。总是。这是对Python 2的更改;该功能已重命名为。

  • 问题内容: 我试图像这样制作垂直的seaborn boxplot 我得到 我写东方 并得到 但 作品coreect!怎么了? 问题答案: 对于Seaborn的箱形图,在水平和垂直对齐方式之间切换时,请务必注意x轴和y轴的分配: 混淆列会导致seaborn尝试计算分类数据框中的摘要统计信息,这肯定会失败。

  • 我正在使用sql server进行数据库连接。并且我希望在运行多个结果集时保持结果集打开。我使用了,但在执行语句时出现以下错误, 由于我是使用sql server的新手,所以我对其中的一些概念还不是很了解。如果有人知道为什么会这样请回答我。

  • 我正在使用ASP.NET 5 如果我将其中一个命令模型名称更改为不同的名称,那么Swagger就可以工作了。然而,我相信这个嵌套类模型名称是合法的,也应该与swagger一起使用。如果有办法解决这个问题。谢谢

  • 我正在为我的小型数据科学项目计算线性回归。 当将list(Dictionary.values())传递到我得到的类中时 回溯(最近的调用为last):文件“C://users/paweé/documents/projects vscode/worldbankdatakeras/tests.py”,第41行,在graph.plot_graph_renewable_electricity_status