非常经典的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(empty($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文件上传类分享 的全部内容, 来源链接: utcz.com/z/325513.html

回到顶部