您的位置:首页 > 其它

文件上传类

2015-10-05 23:17 337 查看
<?php
/*
* 文件上传类
*/
class UploadFile {

private $filepath; // 指定上传文件保存的路径
private $allowtype = array (
'gif',
'jpg',
'png',
'jpeg'
); // 充许上传文件的类型
private $maxsize = 1000000; // 允上传文件的大小 1M
private $israndname = true; // 是否随机重命名, true false不随机,使用原文件名
private $originName; // 源文件名称
private $tmpFileName; // 临时文件名
private $fileType; // 文件类型
private $fileSize; // 文件大小
private $newFileName; // 新文件名
private $errorNum = 0; // 错误号
private $errorMess = ""; // 用来提供错误报告

/**
* 用于对上传文件初使化
* 1.指定上传路径, 2,充许的类型, 3,限制大小, 4,是否使用随机文件名称
* 让用户可以不用按位置传参数,后面参数给值不用将前几个参数也提供值
*/
function __construct($options = array()) {
foreach ( $options as $key => $val ) {
$key = strtolower ( $key );
// 查看用户参数中数组的下标是否和成员属性名相同
if (! in_array ( $key, get_class_vars ( get_class ( $this ) ) )) {
continue;
}
$this->setOption ( $key, $val );
}
}

// 用来上传一个文件
function uploadFile($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'];

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 {
$error [] = $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;
} else {
$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 ();
if ($this->copyFile ()) {
return true;
} else {
$return = false;
}
} else {
$return = false;
}
} else {
$return = false;
}
if (! $return)
$this->errorMess = $this->getError ();
return $return;
}
}

private function getError() {
$str = "出错啦:";
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;
}

// 用来检查文件上传路径
private function checkFilePath() {
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 checkFileSize() {
if ($this->fileSize > $this->maxsize) {
$this->setOPtion ( 'errorNum', '-2' );
return false;
} else {
return true;
}
}

// 用于检查文件上传类型
private function checkFileType() {
if (in_array ( strtolower ( $this->fileType ), $this->allowtype )) {
return true;
} else {
$this->setOption ( 'errorNum', - 1 );
return false;
}
}
// 设置上传后的文件名称
private function setNewFileName() {
if ($this->israndname) {
$this->setOption ( 'newFileName', $this->proRandName () );
} else {
$this->setOption ( 'newFileName', $this->originName );
}
}

// 设置随机文件名称
private function proRandName() {
$fileName = date ( "YmdHis" ) . rand ( 100, 999 );
return $fileName . '.' . $this->fileType;
}

private function setOption($key, $val) {
$this->$key = $val;
}

private function copyFile() {
if (! $this->errorNum) {
$filepath = rtrim ( $this->filepath, '/' ) . '/';
$filepath .= $this->newFileName;

if (@move_uploaded_file ( $this->tmpFileName, $filepath )) {
return true;
} else {
$this->setOption ( 'errorNum', - 3 );
return false;
}
} else {
return false;
}
}

// 设置和$_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 );
$arrStr = explode ( '.', $name );
$this->setOption ( 'fileType', strtolower ( $arrStr [count ( $arrStr ) - 1] ) );
$this->setOption ( 'fileSize', $size );
return true;
}

// 用于获取上传后文件的文件名
function getNewFileName() {
return $this->newFileName;
}
// 上传如果失败,则调用这个方法,就可以查看错误报告
function getErrorMsg() {
return $this->errorMess;
}

}
?>


实例演示:

<?php
include './UploadFile.class.php';

$upfileconfig = array(
'filepath'=>'attachements',
'allowtype'=>array('gif', 'jpg', 'png', 'jpeg', 'pptx', 'docx'),
'maxsize'=>3000000
);

$upfile = new UploadFile($upfileconfig);

$upfile->uploadFile('uploadfile');

//echo $upfile->getErrorMsg(); 遇到错误可用此方法查看
?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: