【Codeigniter-Upload类】上传zip/rar文件

在使用Codeigniter搭建员工工作量评价管理系统时,遇到上传zip/rar文件失败的问题,错误提示为不允许的文件类型。检查配置文件未发现错误,进一步研究Upload类源码发现do_upload()函数中有关文件类型检查的代码。通过对源码的分析和调试,解决了上传限制问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在用Codeigniter框架搭一个员工工作量评价管理系统,要求能上传zip/rar文件。框架自带了文件上传类Upload,看了一阵用户指南咱就撸袖子干了起来,前台后台三下五除二码完。找个压缩文件测试,上传,出错了,日志显示"The filetype you are attempting to upload is not allowed."。文件类型不对,略不解,我可接受的文件类型保存在一个字符串中,加载Upload类的时候把它和其它的配置信息一起作为参数传递给构造函数。

$config['upload_path'] = './upload/';//上传路径
$config['allowed_types'] = 'zip|rar';//可接受文件类型
$this->load->library('upload', $config);//加载Upload类

配置信息写这里找不出什么毛病,只好去Upload类源码里看看发生了什么事情。加载完Upload类后调用do_upload()函数就会执行上传文件的一系列操作,其中就包括文件类型的检查。do_upload()函数中检查文件类型的代码如下:

// Is the file type allowed to be uploaded?
if ( ! $this->is_allowed_filetype())
{
        $this->set_error('upload_invalid_filetype');
	return FALSE;
}
从这里转到is_allowed_filetype()函数:

public function is_allowed_filetype($ignore_mime = FALSE)
{
        if ($this->allowed_types == '*')
        {
		return TRUE;
	}

	if (count($this->allowed_types) == 0 OR ! is_array($this->allowed_types))
	{
		$this->set_error('upload_no_file_types');
		return FALSE;
	}

	$ext = strtolower(ltrim($this->file_ext, '.'));
	
	if ( ! in_array($ext, $this->allowed_types))
	{
		return FALSE;
	}

	// Images get some additional checks
	$image_types = array('gif', 'jpg', 'jpeg', 'png', 'jpe');

	if (in_array($ext, $image_types))
	{
		if (getimagesize($this->file_temp) === FALSE)
		{
			return FALSE;
		}
	}

	if ($ignore_mime === TRUE)
	{
		return TRUE;
	}

	$mime = $this->mimes_types($ext);

	if (is_array($mime))
	{
		if (in_array($this->file_type, $mime, TRUE))
		{
			return TRUE;
		}
	}
	elseif ($mime == $this->file_type)
	{
			return TRUE;
	}
	return FALSE;
}
忽略处理图片格式的那些代码,这个函数的功能就是在允许接受的文件类型中查找待上传文件的后缀名,然后检查mime类型。我之前一直没有考虑mime类型这回事,看到这里就又追到了mimes_types()函数里去一探究竟。这个函数在一个配置文件mime.php中查找参数指定的扩展名可能匹配的mime类型,我打印出is_allowed_filetype()函数中的$mime值,发现了问题所在。如果我上传了rar类型的文件,$mime == false,如果是zip类型的文件,$mime == array('application/x-zip', 'application/zip', 'application/x-zip-compressed')。又打印了$this->file_type查看,发现不管是zip还是rar其值都是'application/octet-stream',这样自然是不能通过is_allowed_filetype()函数的检查。解决方法就是在mime.php文件中的$mime数组中加入'application/octet-stream'。

'zip'	=>  array('application/x-zip', 'application/zip', 'application/x-zip-compressed', 'application/octet-stream'),//原来只有前三项
'rar' => array('application/octet-stream'),//原来根本就没有rar这一项,整个都是自己加上去的
保存再测试,就能顺利上传了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值