FileUploader类使用指南
要理解FileUploader类,必须先了解php上传文件的一些基本常识。具体请参考php手册--章 38. 文件上传处理
。
FileUploader.php中包含2个类,分别为FLEA_Helper_FileUploader和FLEA_Helper_UploadFile。
FLEA_Helper_FileUploader
FLEA_Helper_FileUploader类实现了一个简单的、可扩展的文件上传助手,我们一般处理上传文件都是从这个类继承或者获得实例。
成员变量:
_files
所有的 UploadFile 对象实例
_count
可用的上传文件对象数量
成员函数:
FLEA_Helper_FileUploader()
/**
* 构造函数
*
* @return FLEA_Helper_FileUploader
*/
函数原型:FLEA_Helper_FileUploader()
getCount()
/**
* 可用的上传文件对象数量
*
* @return int
*/
函数原型:getCount()
getFiles()
/**
* 返回所有的上传文件对象
*
* @return array
*/
函数原型:getFiles()
existsFile()
/**
* 检查指定名字的上传文件对象是否存在
* @return boolean
*/
函数原型:existsFile($name)
参数说明:上传文件的input的name。
getFile()
/**
* 返回指定名字的上传文件对象
* @return FLEA_Helper_UploadFile
*/
函数原型:getFile($name)
参数说明:上传文件的input的name。
isFileExist()
/**
* 检查指定的上传文件是否存在
* @return boolean
*/
函数原型:isFileExist($name)
参数说明:上传文件的input的name。
batchMove()
/**
* 批量移动上传的文件到目标目录
*/
函数原型:batchMove($destDir)
参数说明:目标目录
FLEA_Helper_UploadFile
FLEA_Helper_UploadFile 封装一个上传的文件。这个类的使用不需你进行实例化或者继承它。在实例化FLEA_Helper_FileUploader时,就自动地为每一个上传文件实例化了一个FLEA_Helper_UploadFile实例。
成员变量:
_file
上传文件信息
_name
上传文件对象的名字
成员函数:
FLEA_Helper_UploadFile()
/**
* 构造函数
* @return FLEA_Helper_UploadFile
*/
函数原型:
FLEA_Helper_UploadFile($struct, $name)
参数说明:
$struct
上传文件的基本信息数组,就像 $_FILES[‘userfile’];
$name
上传文件的input的name.
setAttribute()
/**
* 设置自定义属性
*/
函数原型:setAttribute($name, $value)
参数说明:
$name
属性名称
$value
属性值
getAttribute()
/**
* 获取自定义属性
*/
函数原型:getAttribute($name)
参数说明:属性名称
getName()
/**
* 返回上传文件对象的名字
*
* @return string
*/
函数原型:getName()
isSuccessed()
/**
* 指示上传是否成功
*
* @return boolean
*/
函数原型:isSuccessed()
getError()
/**
* 返回上传错误代码
*
* @return int
*/
函数原型:getError()
isMoved()
/**
* 指示上传文件是否已经从临时目录移出
*
* @return boolean
*/
函数原型:isMoved()
getFilename()
/**
* 返回上传文件的原名
*
* @return string
*/
函数原型:getFilename()
getExt()
/**
* 返回上传文件不带"."的扩展名
*
* @return string
*/
函数原型:getExt()
getSize()
/**
* 返回上传文件的大小(字节数)
*
* @return int
*/
函数原型:getSize()
getMimeType()
/**
* 返回上传文件的 MIME 类型(由浏览器提供,不可信)
*
* @return string
*/
函数原型:getMimeType()
getTmpName()
/**
* 返回上传文件的临时文件名
*
* @return string
*/
函数原型:getTmpName()
getNewPath()
/**
* 获得文件的新路径(通常是移动后的新路径,包括文件名)
*
* @return string
*/
函数原型:getNewPath()
Check()
/**
* 检查上传的文件是否成功上传,并符合检查条件(文件类型、最大尺寸)
*
* 文件类型以扩展名为准,多个扩展名以 , 分割,例如 .jpg,.jpeg,.png。
* @return boolean
*/
函数原型:check($allowExts = null, $maxSize = null)
参数说明:
$allowExts
允许上传的扩展类型,如gif, jpg等。
$maxSize
允许上传的文件的最大的大小
move()
/**
* 移动上传文件到指定位置和文件名
*/
函数原型:move($destPath)
参数说明:目标路径
removeMovedFile()
/**
* 删除移动后的文件
*/
函数原型:removeMovedFile()
实例解说:
上传代码界面代码: 引用:<h1>上传文件</h1>
<hr />
<form action="<?php echo $this->_url('file');?>" method="post" enctype="multipart/form-data">
<input type="file" name="userfile" /><button type="submit">Submit</button>
</form>
这有一个地方一定要注意:enctype="multipart/form-data" ,这个一定要写,要不然服务器端得不到上传文件的数据。
上传界面截图:
uploader-ui.jpg (13.28 KB)
2007-4-10 13:46
服务器端代码:
dump($_FILES);
首先,我们先看一下我上传了一个什么样的文件
Array
(
[userfile] => Array
(
[name] => getImage.jpg
[type] => image/pjpeg
[tmp_name] => /usr/local/php/temp\php13.tmp
[error] => 0
[size] => 126425
)
)
Ok ,大家已经明白了我上传文件的基本信息了,现在我们使用FLEA_Helper_FileUploader来处理我们的上传文件。首先载入类(其实就是载入文件)。
引用:FLEA::loadClass(“FLEA_Helper_FileUploader”);
接下来就是获得类的实例,
引用:
$uploader= & new FLEA_Helper_FileUploader();
其实在这一步中,FLEA_Helper_FileUploader的构造函数就已经把每一个上传文件封装成FLEA_Helper_UploadFile类实例。
接下来就是取得相应的上传文件的FLEA_Helper_UploadFile的实例。
在取得实例之前,我们也可以通过existsFile或isFileExist检查上传的文件是否存在。(这2个函数的写法一模一样,不知道廖大为什么要这么做?)
引用:
$uploader->existsFile(“userfile”);
如果存在我们在获取文件的实例。 这里我们就直接获取文件的FLEA_Helper_UploadFile的实例。在下面给出的完整代码中,会把验证的部分加上。
$file= & $uploader->getFile(“userfile”);
注意这里使用的是getFile,getFile是取得一个我们已经知道名字的上传文件的FLEA_Helper_UploadFile的实例。对于多文件上传,应该使用getFiles()方法来获得所有的上传文件的对象数组。
当我们取得上传文件对象之后,我们就可以获得上传文件的详细信息了。
引用:
dump($file);
echo 'name = '.$file->getName().'<br>';
echo 'filename = '.$file->getFilename().'<br>';
echo '扩展名 = '.$file->getExt().'<br>';
echo 'file Size = '.$file->getSize().'<br>';
echo 'tep_name = '.$file->getTmpName().'<br>';
echo 'error_code = '.$file->getError().'<br>';
echo 'isSuccessed = '.$file->isSuccessed().'<br>';
echo 'isMoved = '.$file->isMoved().'<br>';
浏览器显示:
flea_helper_uploadfile Object(
[_file] => Array
(
[name] => getImage.jpg
[type] => image/pjpeg
[tmp_name] => /usr/local/php/temp\php18.tmp
[error] => 0
[size] => 126425
[is_moved] =>
)
[_name] => userfile) name = userfile
filename = getImage.jpg
扩展名 = jpg
file Size = 126425
tep_name = /usr/local/php/temp\php1A.tmp
error_code = 0
isSuccessed = 1
isMoved =
同样我们也可以通过setAttribute方法对$file进行扩展或者做一些改变。
$file->setAttribute('size','111111');
echo 'size = '.$file->getAttribute('size').'<br>';
echo 'file Size = '.$file->getSize().'<br>';
浏览器显示:
size = 111111
file Size = 111111
注意:像getNewPath()这样的方法,只有在文件已经被上传到指定的目录下,即调用了move方法之后,才能得到数据。
由于我们不能总是信赖用户,所以我们要在调用move()方法前,要对用户的上传文件进行检查。检查上传文件是否是我们所允许的文件类型和检查文件大小是否符合我们定的规格。
在检查前,要设置好我们允许的类型和上传的文件大小(这个大小有多方面的考虑因素,具体请参照php手册)。
$allowExt= 'jpg,gif,bmp';
$allowMax= '10000000';
//这个单位是b.
设置好后,我们就可以检查看用户上传的文件是否合格了。
$file->check($allowExt,$allowMax)
接下来,如果合格,就上传,如果不合格就提出警告。
上传调用move()方法,上传前要设置好上传的路径。
$destpath= 'upload/'.$file->getFilename();
代码如下:
引用:
if ($file->check($allowExt,$allowMax)){
echo 'ok';
$destpath= 'upload/'.$file->getFilename();
$file->move($destpath);
}else {
echo 'No';
}
浏览器显示结果:
Ok
就是说明,上传成功。我们在去检查一下,看文件是否在上传的目录中。
uploader-img.jpg (16.85 KB)
2007-4-10 13:46
Ok ,上传成功。
批量上传的方法与此类似,只是像前面说明的那样,在取得文件对象时使用getFiles()方法来取得对象数组。用foreach方法循环这个数组,之后就和上传一个文件是一样的。
完整代码:
引用:
FLEA::loadClass('FLEA_Helper_FileUploader');
$uploader= & new FLEA_Helper_FileUploader();
if ($uploader->existsFile('userfile')){
$file= &$uploader->getFile('userfile');
}else {
echo 'No file is uploaded ;';
exit();
}
dump($file);
echo '<pre>';
echo 'name = '.$file->getName().'<br>';
echo 'filename = '.$file->getFilename().'<br>';
echo '扩展名 = '.$file->getExt().'<br>';
echo 'file Size = '.$file->getSize().'<br>';
echo 'tep_name = '.$file->getTmpName().'<br>';
echo 'error_code = '.$file->getError().'<br>';
echo 'isSuccessed = '.$file->isSuccessed().'<br>';
echo 'isMoved = '.$file->isMoved().'<br>';
$file->setAttribute('size','111111');
echo 'size = '.$file->getAttribute('size').'<br>';
echo 'file Size = '.$file->getSize().'<br>';
echo '</pre>';
$allowExt= 'jpg,gif,bmp';
$allowMax= '10000000';
$destpath= 'upload/'.$file->getFilename();
if ($file->check($allowExt,$allowMax)){
echo 'ok';
$file->move($destpath);
}else {
echo 'No';
}
第一次写教程,很紧张,怕写不好,辜负了大家。现在这个写完了,总算是松一口气。望大家指教和校对。
同时也感谢廖大写出这么好的开源框架。辛苦了。