非常经典的PHP文件上传类分享
这篇文章主要为大家详细介绍了一个经典的PHP文件上传类,降低功能的编写难度,也为了能节省开发时间,通常我们都会将这些反复使用的一段代码封装到一个类中,本文为大家分享了PHP文件上传类,需要的朋友可以参考下。
文件上传是项目开发中比较常见的功能,但文件上传的过程比较繁琐,只要是有文件上传的地方就需要编写这些复杂的代码。为了能在每次开发中降低功能的编写难度,也为了能节省开发时间,通常我们都会将这些反复使用的一段代码封装到一个类中。
- <?php
- /**
- +-----------------------------------------------------------------------------
- * 文件上传类
- +-----------------------------------------------------------------------------
- * @author Administrator
- +-----------------------------------------------------------------------------
- */
- class FileUpload{
- private $filepath; //保存路径
- private $allowtype=array('gif','jpg','jpeg','png','txt');
- private $maxsize=1000000; //最大允许上传大小
- private $israndname=true; //是否随机
- private $orginame; //原始文件名
- private $tmpname; //临时文件名
- private $newname; //新文件名
- private $filetype; //文件类型
- private $filesize; //文件大小
- private $errornum=''; //错误号
- private $errormsg; //错误信息
- /**
- +------------------------------------------------------------------------------
- *构造函数
- +------------------------------------------------------------------------------
- * @param string $savepath 保存路径
- * @param string $allowtype 允许类型
- * @param string $maxsize 允许大小
- *
- +------------------------------------------------------------------------------
- */
- function __construct($option=array()){
- foreach ($option as $key=>$value){
- if (!in_array($key,get_class_vars(get_class($this)))){
- continue;
- }
- $this->setOption($key, $value);
- }
- }
- function uploadfile($field) {
- $return=true;
- if (!$this->CheckPath()) {
- $this->errormsg=$this->geterrorNum();
- return false;
- }
- $name=$_FILES[$field]['name'];
- $tmpname=$_FILES[$field]['tmp_name'];
- $filesize=$_FILES[$field]['size'];
- $error=$_FILES[$field]['error'];
- if (is_array($name)) {
- $errors=array();
- for ($i=0;$i<count($name);$i++){
- if ($this->getFile($name[$i],$tmpname[$i],$filesize[$i],$errors[$i])) {
- if (!$this->CheckSize() && !$this->CheckType()) {
- $errors=$this->getErrorNum();
- return false;
- }
- }else{
- $errors=$this->getErrorNum();
- return false;
- }
- if (!$return) {
- $this->getFile();
- }
- }
- if ($return) {
- $fileNames=array();
- for ($i=0;$i<count($name);$i++){
- if ($this->getFile($name[$i], $tmpname[$i], $filesize[$i], $filesize[$i])) {
- $this->SetFileName();
- if (!$this->MoveFile()) {
- $errors[]=$this->getErrorNum();
- $return=false;
- }else{
- $fileNames[]=$this->getNewName();
- }
- }
- }
- $this->newname=$fileNames;
- }
- $this->errormsg=$errors;
- return $return;
- }else{
- if($this->getFile($name,$tmpname,filesize,$error)){
- if(!$this->CheckSize()){
- return false;
- }
- if(!$this->CheckType()){
- return false;
- }
- $this->SetFileName();
- if ($this->MoveFile()) {
- return true;
- }
- }else{
- return false;
- }
- if (!$return) {
- $this->setOption('ErrorNum', 0);
- $this->errormsg=$this->geterrorNum();
- }
- return $return;
- }
- }
- /**
- +------------------------------------------------------------------------
- *设置类属性值函数
- +------------------------------------------------------------------------
- * @param mix $key
- * @param mix $value
- */
- private function setOption($key,$value){
- $key=strtolower($key);
- $this->$key=$value;
- }
- /**
- +---------------------------------------------------------------------------
- * 获取文件变量参数函数
- +---------------------------------------------------------------------------
- * @param string $name
- * @param string $tmp_name
- * @param number $size
- * @param number $error
- */
- private function getFile($name,$tmpname,$filetype,$filesize,$error=0){
- $this->setOption('TmpName', $tmpname);
- $this->setOption('OrgiName', $name);
- $arrstr=explode('.', $name);
- $this->setOption('FileType', $arrstr[count($arrstr)-1]);
- $this->setOption('FileSize', $filesize);
- return true;
- }
- /**
- +-------------------------------------------------------------------------
- * 检查上传路径函数
- +-------------------------------------------------------------------------
- * @return boolean
- */
- private function CheckPath(){
- if(emptyempty($this->filepath)){
- $this->setOption('ErrorNum', -5);
- return false;
- }
- if (!file_exists($this->filepath)||!is_writable($this->filepath)) {
- if (!@mkdir($this->filepath,0755)) {
- $this->setOption('ErrorNum',-4);
- return false;
- }
- }
- return true;
- }
- private function Is_Http_Post(){
- if (!is_uploaded_file($this->tmpname)) {
- $this->setOption('ErrorNum',-6);
- return false;
- }else{
- return true;
- }
- }
- /**
- +--------------------------------------------------------------------
- *检查文件尺寸函数
- +--------------------------------------------------------------------
- * @return boolean
- */
- private function CheckSize(){
- if ($this->filesize>$this->maxsize) {
- $this->setOption('ErrorNum', -2);
- return false;
- }else{
- return true;
- }
- }
- /**
- +---------------------------------------------------------------
- * 检查文件类型函数
- +---------------------------------------------------------------
- * @return boolean
- */
- private function CheckType(){
- if (in_array($this->filetype, $this->allowtype)) {
- return true;
- }else{
- $this->setOption('ErrorNum', -1);
- return false;
- }
- }
- private function SetFileName(){
- if ($this->israndname) {
- $this->setOption('NewName', $this->RandName());
- }else{
- $this->setOption('NewName',$this->orginame);
- }
- }
- /**
- +-----------------------------------------------------------------
- * 获取新文件名
- +------------------------------------------------------------------
- */
- public function getNewName() {
- return $this->newname;
- }
- private function RandName(){
- $rule=date("YmdHis").rand(0, 999);
- return $rule.'.'.$this->filetype;
- }
- private function MoveFile(){
- if ($this->errornum) {
- $filepath=rtrim($this->filaepath,'/').'/';
- $filepath.=$this->newname;
- if (@move_uploaded_file($this->tmpname,$filepath)) {
- return true;
- }else{
- $this->errormsg=$this->setOption('ErrorNum',-3 );
- }
- }else{
- return false;
- }
- }
- /**
- +----------------------------------------------------------------
- * 错误信息函数
- +----------------------------------------------------------------
- * @return string
- */
- function getErrorNum() {
- $erstr="上传文件<font color='red'>{$this->orginame}</font>出错";
- switch ($this->errornum) {
- case 4:
- $erstr.="没有文件被上传";
- break;
- case 3:
- $erstr.="文件只被部分上传";
- break;
- case 2:
- $erstr.="上传文件超过了HTML表单MAX_FILE_SIZE指定的值";
- break;
- case 1:
- $erstr.="上传文件超过了php.ini配置文件中upload_max_filesize的值";
- break;
- case 0:
- $erstr="上传{$this->orginame}成功";
- break;
- case -1:
- $erstr="未允许的类型";
- break;
- case -2:
- $erstr.="文件过大,不能超过{$this->maxsize}个字节";
- break;
- case -3:
- $erstr.="上传失败";
- break;
- case -4:
- $erstr="创建上传目录失败,请重新指定上传目录";
- break;
- case -5:
- $erstr="未指定上传路径";
- break;
- case -6:
- $erstr="非法操作";
- break;
- default:
- $erstr.="未知错误";
- }
- return $erstr;
- }
- }
- ?>
以上就是本文的全部内容,希望对大家学习php程序设计有所帮助。