Upload类的配置信息中有一个overwrite,取boolean值,默认值为false,表示是否覆盖同名文件。该参数为TRUE时,如果上传文件时碰到重名文件,将会把原文件覆盖;如果该参数为FALSE,CI将会在新文件的文件名后面加一个数字。这样一来,不管怎么设置overwrite的值,同名文件都会被成功上传,这有时会造成一些麻烦。如果我们将上传同名文件视为错误操作而且要彻底阻止它,那么就需要修改Upload类。
Upload类中的set_filename()函数负责对上传的文件命名,代码如下:
public function set_filename($path, $filename)
{
if ($this->encrypt_name == TRUE){
mt_srand();
$filename = md5(uniqid(mt_rand())).$this->file_ext;
}
if ( ! file_exists($path.$filename))
{
return $filename;
}
$filename = str_replace($this->file_ext, '', $filename);
$new_filename = '';
for ($i = 1; $i < 100; $i++)
{
if ( ! file_exists($path.$filename.$i.$this->file_ext))
{
$new_filename = $filename.$i.$this->file_ext;
break;
}
}
if ($new_filename == '')
{
$this->set_error('upload_bad_filename');
return FALSE;
}
else
{
return $new_filename;
}
}
函数最开始是对文件名加密的一些操作,无视它,接下来的很简单,如果上传目录中没有同名文件就直接返回原文件名,否则就会在文件名后面加上一个序号。我的处理方法是把添加序号的部分全部注释掉,然后添加发现同名文件情况时的代码,输出错误信息,并返回false,像这样(去掉了注释掉的部分):
public function set_filename($path, $filename)
{
if ($this->encrypt_name == TRUE)
{
mt_srand();
$filename = md5(uniqid(mt_rand())).$this->file_ext;
}
if ( ! file_exists($path.$filename))
{
return $filename;
}
else {
$this->set_error("Filename Conflict: There is already a file named \"$filename\".");
return false;
}
}