我正在通过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。