This article mainly introduces a classicPHPfile upload class sharing. This article explains in detail and comprehensively the requirements analysis and function implementation related toPHPfile upload, and shares it at the same time.PHPcode, friends who need it can refer to this article
File upload is a common function in project development, but the file upload process is more cumbersome, as long as there are files uploaded Wherever you need to write these complex codes. In order to reduce the difficulty of writing functions in each development and to save development time, we usually encapsulate these repeatedly used pieces of code into a class. Help developers in future development to implement complex file upload functions by writing a few simple codes. For readers with weak foundation, they only need to be able to use this class. For those who like challenges, they can try to understand it and develop a file upload class of their own.
1. Requirements Analysis
It is necessary to customize the file upload class, which can complete the following functions under the premise that it is very easy to use:
①Support single file upload.
②Support multiple file uploads.
③You can specify the storage location of the uploaded file yourself, you can set the size and type allowed for the uploaded file, you can rename the uploaded file by the system, and you can also set the original name of the uploaded file to be retained.
(Note: It is required that single file upload and multiple file upload must use the same operation method, and some settings for upload must also use the same method).
2. Programming
According to the requirements of the program, we can declare 4 visible member attributes for the file upload class, so that users can You can also set some behaviors. The required member attributes are as shown in the following table:
In order to prevent the attribute values from being assigned some illegal values, these member attributes need to be encapsulated and cannot be accessed outside the object. Then assign values to the above four member attributes through the set() method declared in the class. The set() method has two parameters. The first parameter is the name of the member attribute (not case-sensitive), and the second parameter is the value corresponding to the attribute in the previous parameter. After the set() method is called, the object ($this) is returned. Therefore, in addition to assigning values to each attribute individually, you can also perform consecutive operations to assign values to multiple attributes together. In this example, in addition to the set() method, the most important thing is to implement the function of uploading files, so the system mainly provides the following public methods to implement file upload operations, as shown in the following table:
In order to prevent the attribute values from being assigned some illegal values, these member attributes need to be encapsulated and cannot be accessed outside the object, and then the above four member attributes can be assigned values through the set() method declared in the class. The set() method has two parameters. The first parameter is the name of the member attribute (not case-sensitive), and the second parameter is the value corresponding to the attribute in the previous parameter. After the set() method is called, the object ($this) is returned. Therefore, in addition to assigning values to each attribute individually, you can also perform consecutive operations to assign values to multiple attributes together. In this example, in addition to the set() method, the most important thing is to implement the function of uploading files, so the system mainly provides the following public methods to implement file upload operations, as shown in the following table:
setOption($key, $val); } return $this; } /** * 调用该方法上传文件 * @param string $fileFile 上传文件的表单名称 * @return bool 如果上传成功返回数true */ function upload($fileField) { $return = true; /* 检查文件路径是滞合法 */ if( !$this->checkFilePath() ) { $this->errorMess = $this->getError(); return false; } /* 将文件上传的信息取出赋给变量 */ $name = $_FILES[$fileField]['name']; $tmp_name = $_FILES[$fileField]['tmp_name']; $size = $_FILES[$fileField]['size']; $error = $_FILES[$fileField]['error']; /* 如果是多个文件上传则$file["name"]会是一个数组 */ if(is_Array($name)){ $errors=array(); /*多个文件上传则循环处理 , 这个循环只有检查上传文件的作用,并没有真正上传 */ for($i = 0; $i < count($name); $i++){ /*设置文件信息 */ if($this->setFiles($name[$i],$tmp_name[$i],$size[$i],$error[$i] )) { if(!$this->checkFileSize() || !$this->checkFileType()){ $errors[] = $this->getError(); $return=false; } }else{ $errors[] = $this->getError(); $return=false; } /* 如果有问题,则重新初使化属性 */ if(!$return) $this->setFiles(); } if($return){ /* 存放所有上传后文件名的变量数组 */ $fileNames = array(); /* 如果上传的多个文件都是合法的,则通过销魂循环向服务器上传文件 */ for($i = 0; $i < count($name); $i++){ if($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i] )) { $this->setNewFileName(); if(!$this->copyFile()){ $errors[] = $this->getError(); $return = false; } $fileNames[] = $this->newFileName; } } $this->newFileName = $fileNames; } $this->errorMess = $errors; return $return; /*上传单个文件处理方法*/ } else { /* 设置文件信息 */ if($this->setFiles($name,$tmp_name,$size,$error)) { /* 上传之前先检查一下大小和类型 */ if($this->checkFileSize() && $this->checkFileType()){ /* 为上传文件设置新文件名 */ $this->setNewFileName(); /* 上传文件 返回0为成功, 小于0都为错误 */ if($this->copyFile()){ return true; }else{ $return=false; } }else{ $return=false; } } else { $return=false; } //如果$return为false, 则出错,将错误信息保存在属性errorMess中 if(!$return) $this->errorMess=$this->getError(); return $return; } } /** * 获取上传后的文件名称 * @param void 没有参数 * @return string 上传后,新文件的名称, 如果是多文件上传返回数组 */ public function getFileName(){ return $this->newFileName; } /** * 上传失败后,调用该方法则返回,上传出错信息 * @param void 没有参数 * @return string 返回上传文件出错的信息报告,如果是多文件上传返回数组 */ public function getErrorMsg(){ return $this->errorMess; } /* 设置上传出错信息 */ private function getError() { $str = "上传文件{$this->originName}时出错 : "; switch ($this->errorNum) { case 4: $str .= "没有文件被上传"; break; case 3: $str .= "文件只有部分被上传"; break; case 2: $str .= "上传文件的大小超过了HTML表单中MAX_FILE_SIZE选项指定的值"; break; case 1: $str .= "上传的文件超过了php.ini中upload_max_filesize选项限制的值"; break; case -1: $str .= "未允许类型"; break; case -2: $str .= "文件过大,上传的文件不能超过{$this->maxsize}个字节"; break; case -3: $str .= "上传失败"; break; case -4: $str .= "建立存放上传文件目录失败,请重新指定上传目录"; break; case -5: $str .= "必须指定上传文件的路径"; break; default: $str .= "未知错误"; } return $str.'
'; } /* 设置和$_FILES有关的内容 */ private function setFiles($name="", $tmp_name="", $size=0, $error=0) { $this->setOption('errorNum', $error); if($error) return false; $this->setOption('originName', $name); $this->setOption('tmpFileName',$tmp_name); $aryStr = explode(".", $name); $this->setOption('fileType', strtolower($aryStr[count($aryStr)-1])); $this->setOption('fileSize', $size); return true; } /* 为单个成员属性设置值 */ private function setOption($key, $val) { $this->$key = $val; } /* 设置上传后的文件名称 */ private function setNewFileName() { if ($this->israndname) { $this->setOption('newFileName', $this->proRandName()); } else{ $this->setOption('newFileName', $this->originName); } } /* 检查上传的文件是否是合法的类型 */ private function checkFileType() { if (in_array(strtolower($this->fileType), $this->allowtype)) { return true; }else { $this->setOption('errorNum', -1); return false; } } /* 检查上传的文件是否是允许的大小 */ private function checkFileSize() { if ($this->fileSize > $this->maxsize) { $this->setOption('errorNum', -2); return false; }else{ return true; } } /* 检查是否有存放上传文件的目录 */ private function checkFilePath() { if(empty($this->path)){ $this->setOption('errorNum', -5); return false; } if (!file_exists($this->path) || !is_writable($this->path)) { if (!@mkdir($this->path, 0755)) { $this->setOption('errorNum', -4); return false; } } return true; } /* 设置随机文件名 */ private function proRandName() { $fileName = date('YmdHis')."_".rand(100,999); return $fileName.'.'.$this->fileType; } /* 复制上传文件到指定的位置 */ private function copyFile() { if(!$this->errorNum) { $path = rtrim($this->path, '/').'/'; $path .= $this->newFileName; if (@move_uploaded_file($this->tmpFileName, $path)) { return true; }else{ $this->setOption('errorNum', -3); return false; } } else { return false; } } }
4. Application process of file upload class
The file upload class FileUpload in this example supports single file upload and multiple files at the same time. There is no difference in the processing method when uploading to the server. However, when writing an upload bid, multiple file uploads must be passed to the server in an array. The single file upload form is as follows:
The above forms all point the submission location to the same file upload.php, so it is not difficult to see that the single and Multiple file uploads are processed in the same way. The upload.php code is as follows:
set("path", "./images/"); $up -> set("maxsize", 2000000); $up -> set("allowtype", array("gif", "png", "jpg","jpeg")); $up -> set("israndname", false); //使用对象中的upload方法, 就可以上传文件, 方法需要传一个上传表单的名子 pic, 如果成功返回true, 失败返回false if($up -> upload("pic")) { echo ''; //获取上传后文件名子 var_dump($up->getFileName()); echo ''; } else { echo ''; //获取上传失败以后的错误提示 var_dump($up->getErrorMsg()); echo ''; } ?>Copy after login
In the upload.php file, it must first be loaded File upload FileUpload class is located in the file fileupload.class.php. Then instantiate the object of the file upload class, and then upload the file by calling the upload() method. If the upload is successful, you can get the uploaded file name through the getFileName() method. If the upload fails, you can also get the error through the getErrorMsg() method. Report. If you need to change some upload behaviors, you can complete the setting of some attributes by calling the set() method. The set() method can be used alone to set the value of an attribute. If you need to change the values of multiple attributes, you can call the set() method continuously to set it, or you can set multiple attributes at the same time in a continuous operation.
related suggestion:
PHP encapsulated multi-file upload class examples and usage details
php Sample code sharing for file upload
The above is the detailed content of A PHP file upload class sharing_php example. For more information, please follow other related articles on the PHP Chinese website!