您的位置 首页 php

php文件上传类应用实例

一、文件上传类

<?php

class uploadFile {

//默认设置

private $fieldname;

private $filename;//新的文件名

private $filepath=’./uploads/’;

private $maxsize=500000;//设置上传文件的大小:单位是B

private $allowtype=array(‘jpg’,’jpeg’,’gif’,’png’);

//$_FILES传递的属性:在类中,这就相当于类中的“全局变量”

private $errorNum=0;//错误号(0:没有错误;正数:系统错误号;负数:自定义错误号;)

private $fileSize;//上传文件的大小

private $originalFileName;//源文件名(用于获取文件的拓展名)

private $tempFileName;//上传时的临时文件名(用于移动文件到指定目录)

private $filetype;

private $messageError;//单个文件上传错误消息

private $messageErrors=array();//多个文件上传错误消息

private $tempNewFileName;//不包含拓展名的文件名

private $filenames=array();//存放多个文件名

//用户可以不必按照顺序进行传递参数:可推广应用到其它类

function __construct($options=array()){

$arr=$this->getClassVarName();

foreach ($options as $key=>$v){

$key=strtolower($key);

if(in_array($key, $arr)){

$this->$key=$v;

}

}

}

/*

* uploadSingleFile():上传单张图片

* $files:上传文件资源句柄

* $fieldname:上传文件的表单名,本例中是’pic’

* $filename:新文件名(不需要指定拓展名)

* $filepaht:文件存放路径

* $allowtype:设定循序上传文件的类型

*

*/

function uploadSingleFile(){

if($this->checkFilePath()){

$this->tempNewFileName=$this->filename;

if($this->getFilesAttr()){//获取$_FILES传递的属性并赋值给类中的全局变量

if($this->checkError()){

return true;

}else{

$this->messageError=$this->getError();

return false;

}

}else{

$this->messageError=$this->getError();

return false;

}

}else{

$this->messageError=$this->getError();

return false;

}

}

function uploadMultipleFile(){

$return=true;

if($this->checkFilePath()){

$error=$_FILES[$this->fieldname][‘error’];

$name=$_FILES[$this->fieldname][‘name’];

$fileSize=$_FILES[$this->fieldname][‘size’];

$tempFileName=$_FILES[$this->fieldname][‘tmp_name’];

$this->tempNewFileName=$this->filename;

$count=count($name);

for ($i = 0; $i < $count; $i++) {

if($this->getMultipleFilesAttr($error[$i],$name[$i],$fileSize[$i],$tempFileName[$i])){

if(!$this->checkFileType() || !$this->checkFileSize()){

$this->messageErrors[]=$this->getError();

$return = false;

}

}else{

$this->messageErrors[]=$this->getError();

$return = false;

}

$this->getMultipleFilesAttr();

}

//移动文件:当没有错误时,才会移动所有文件

if($return){

for ($i = 0; $i < $count; $i++) {

if($this->getMultipleFilesAttr($error[$i],$name[$i],$fileSize[$i],$tempFileName[$i])){

if(!$return){

$this->messageErrors[]=$this->getError();

$return = false;

}elseif(!$this->checkMoving()){

$this->messageErrors[]=$this->getError();

$return = false;

}

}else{

$this->messageErrors[]=$this->getError();

$return = false;

}

$this->getMultipleFilesAttr();

}

}

return $return;

}else{

$this->messageErrors[]=$this->getError();

$return = false;

return $return;

}

}

/*

* 检查文件路径

*/

private function checkFilePath(){

if(empty($this->filepath)){

$this->errorNum=-1;

return false;

}

if(!file_exists($this->filepath) || !is_writable($this->filepath)){

mkdir($this->filepath,0755);

}

return true;

}

/*

* 检查错误

*/

private function checkError(){

if($this->checkFileType() && $this->checkFileSize()){

if(!$this->checkMoving()){

return false;

}else{

return true;

}

}else{

return false;

}

}

/*

* 检查文件类型

*/

private function checkFileType(){

$arr=explode(‘.’, $this->originalFileName);

$this->filetype=strtolower($arr[count($arr)-1]);

if(!in_array($this->filetype, $this->allowtype)){

$this->errorNum=-2;

return false;

}else{

return true;

}

}

/*

* 检查文件大小

*/

private function checkFileSize(){

if($this->fileSize > $this->maxsize){

$this->errorNum=-3;

return false;

}else{

return true;

}

}

/*

* 检查移动文件是否成功

*/

private function checkMoving(){

//step 4:改名、指定新路径

$this->filename=$this->tempNewFileName.rand(100, 999).’.’.$this->filetype;

$this->filenames[]=$this->filename;

$this->filepath=rtrim($this->filepath,’/’).’/’;

//step 5:移动

//特别注意:这里必须指明新文件名,否则将无法移动,暂不知什么原因

if(is_uploaded_file($this->tempFileName)){

if(!move_uploaded_file($this->tempFileName, $this->filepath.$this->filename)){

$this->errorNum=-4;

return false;

}

}else{

$this->errorNum=-5;

return false;

}

return true;

}

/*

* getClassVarName():获取成员变量名

*/

private function getClassVarName(){

$tempArr=get_class_vars(get_class($this));

$arr=array();

foreach ($tempArr as $k=>$value){

$arr[]=$k;

}

return $arr;

}

/*

* 获取单个$_FILES传递的属性值

*/

private function getFilesAttr(){

$this->errorNum=$_FILES[$this->fieldname][‘error’];

$this->originalFileName=$_FILES[$this->fieldname][‘name’];

if($this->errorNum){

return false;

}else{

$this->fileSize=$_FILES[$this->fieldname][‘size’];

$this->tempFileName=$_FILES[$this->fieldname][‘tmp_name’];

return true;

}

}

/*

* 获取多个$_FILES传递的属性值

*/

private function getMultipleFilesAttr($error,$name,$fileSize,$tempFileName){

$this->errorNum=$error;

$this->originalFileName=$name;

if($this->errorNum){

return false;

}else{

$this->fileSize=$fileSize;

$this->tempFileName=$tempFileName;

return true;

}

}

/*

* 获取错误信息

*/

private function getError(){

$str=’上传文件<font color=”red”>’.$this->originalFileName.'</font>时出错,’;

switch ($this->errorNum) {

case 1:

$str.= “上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值<br>”;

break ;

case 2:

$str.= “上传文件的大小超过了 html 表单中 MAX_FILE_SIZE 选项指定的值”;

break;

case 3:

$str.= “文件只有部分被上传”;

break;

case 4:

$str.= “没有文件被上传”;

break;

case -1:

$str.= ‘必须指定上传路径!’;

break;

case -2:

$str.= ‘文件类型不支持!’;

break;

case -3:

$str.= ‘上传的文件太大,不要超过’.$this->maxsize.”;

break;

case -4:

$str.= ‘上传失败,没有权限上传文件!’;

break;

case -5:

$str.=’这不是一个上传文件!’;

break;

default:

$str.= ‘未知错误’;

break;

}

return $str;

}

/*

* 传递错误消息用于外部调用

*/

function getMessageError($type){

if($type){

return $this->messageError;

}else{

return $this->messageErrors;

}

}

/*

* 传递新文件名用于外部调用

*/

function getFileName($type){

if($type){

return $this->filename;

}else{

return $this->filenames;

}

}

/*

* 传递路径用于外部调用

*/

function getFilePath(){

return $this->filepath;

}

}

?>

二、文件上传表单

<html>

<head>

<meta http-equiv=”Content-Type” content=”text/html;charset=UTF-8″>

<title> File Uploads </title>

</head>

<body>

<form action=”upload.php” method=”post” enctype=”multipart/form-data”>

<input type=”hidden” name=”MAX_FILE_SIZE” value=”100000000″>

<input type=”file” name=”pic”> <br>

<input type=”submit” name=”sub” value=”上传”>

</form>

</body>

</html>

三、文件上传处理

<?php

header(‘Content-Type:text/html;charset=utf8’);

//注:$_FILES是全局变量,因此无需传递,便可到处使用!

/* 第一步:自定义上传设置

* 用户可自定义的设置: 只能使用如下的属性名(不区分大小写)

* ‘fieldname’ => ‘表单字段名’

* ‘filename’, => ‘上传后的文件名’

* ‘filepath’, => ‘上传文件路径’

* ‘$maxsize’, => ‘上传文件大小的最大值’

* ‘allowtype’ => ‘允许上传文件的类型’

* 拓展:这个数组可以保存为一个配置文件

*/

$arr=array(

‘filename’ => date(‘Y’).date(‘m’).date(‘d’).date(‘H’).date(‘i’).date(‘s’),

‘fieldname’ => ‘pic’

);

//第二步:实例化上传类

require ‘uploadFile.class.php’;

$up =new uploadFile($arr);

//上传图片

if(!is_array($_FILES[‘pic’][‘name’])){//上传单张图片

if($up->uploadSingleFile()){

//获取上传后的新文件名,用于插入到数据库当中

echo $up->getFileName(1);

}else{

$messageError = $up->getMessageError(1);

echo $messageError;

}

}else{//上传多张图片:必须同时上传成功

if($up->uploadMultipleFile()){

print_r($up->getFileName(0));

}else{

print_r($up->getMessageError(0));

}

}

文章来源:智云一二三科技

文章标题:php文件上传类应用实例

文章地址:https://www.zhihuclub.com/76935.shtml

关于作者: 智云科技

热门文章

网站地图