分享一个PHP文件上传类
2021-06-15 06:05
标签:文件处理 err 位置 php continue 服务 for 路径 数组 该类用于处理文件上传,可以上传一个文件,也可以上传多个文件。 包括的成员属性有: 包含的方法有: 1、构造函数,用户初始化成员属性 2、获取文件名称 3、返回错误信息 4、设置$_FILES相关内容 5、设置成员属性值 6、设置上传后文件名 7、检查文件是否合法 8、检查文件是否重名 9、检查文件大小是否符合 10、检查是否存在上传目录 11、设置随机文件名 12、移动上传文件到指定位置 13、设置错误提示信息 14、通过upload()方法上传文件 分享一个PHP文件上传类 标签:文件处理 err 位置 php continue 服务 for 路径 数组 原文地址:http://www.cnblogs.com/trim/p/7277163.html 1 private $path = "./uploads"; //上传文件保存的路径
2 private $type = array(‘jpg‘,‘gif‘,‘png‘); //设置限制上传文件的类型
3 private $maxSize = 1000000; //限制文件上传大小(字节)
4 private $isRandName = true; //设置是否随机重命名文件, false不随机
5 private $isOverName = false; //是否覆盖同名文件 false不覆盖 true覆盖
6 private $errorNum = 0; //错误号
7 private $errorMsg =""; //错误报告消息
8 private $oldName; //源文件名
9 private $tmpFileName; //临时文件名
10 private $fileType; //文件类型(文件后缀)
11 private $fileSize; //文件大小
12 private $newFileName; //新文件名
1 /**
2 * 初始化成员属性 用于设置($path, $type, $maxSize, $isRandName)
3 * @param [string] $key [成员属性名]
4 * @param [type] $value [为成员属性设置的值]
5 * @param array $option [成员初始值]
6 */
7 public function __construct($option = array()){
8 foreach ($option as $key => $value) {
9 if (!in_array($key, get_class_vars(get_class($this)))) {
10 continue;
11 }
12 $this->setOption($key, $value);
13 }
14 }
1 /**
2 * 获取上传后的文件名称
3 * @param void 没有参数
4 * @return string 上传后,新文件的名称, 如果是多文件上传返回数组
5 */
6 public function getFileName(){
7 return $this->newFileName;
8 }
1 /**
2 * 上传失败后,调用该方法则返回,上传出错信息
3 * @param void 没有参数
4 * @return string 返回上传文件出错的信息报告,如果是多文件上传返回数组
5 */
6 public function getErrorMsg(){
7 return $this->errorMsg;
8 }
1 /* 设置和$_FILES有关的内容 */
2 private function setFiles($name = "", $tmp_name = "", $size = 0, $error = 0) {
3 $this->setOption(‘errorNum‘, $error);
4 if($error){
5 return false;
6 }
7
8 $this->setOption(‘oldName‘, $name);
9 $this->setOption(‘tmpFileName‘, $tmp_name);
10 $aryStr = explode(".", $name);
11 $this->setOption(‘fileType‘, strtolower($aryStr[count($aryStr) - 1]));
12 $this->setOption(‘fileSize‘, $size);
13 return true;
14 }
1 /* 为单个成员属性设置值 */
2 private function setOption($key, $val) {
3 $this->$key = $val;
4 }
1 /* 设置上传后的文件名称 */
2 private function setNewFileName() {
3 if ($this->isRandName) {
4 $this->setOption(‘newFileName‘, $this->proRandName());
5 } else{
6 $this->setOption(‘newFileName‘, $this->oldName);
7 }
8 }
1 /* 检查上传的文件是否是合法的类型 */
2 private function checkFileType() {
3 if (in_array(strtolower($this->fileType), $this->type)) {
4 return true;
5 }else {
6 $this->setOption(‘errorNum‘, -1);
7 return false;
8 }
9 }
1 /*检查上传文件是否重名*/
2 private function checkFileName(){
3 $path = $this->path.‘\\‘.$this->newFileName;
4 if (file_exists($path) && $this->isOverName != true) {
5 $this->setOption(‘errorNum‘, -6);
6 return false;
7 }else{
8 return true;
9 }
10 }
1 /* 检查上传的文件是否是允许的大小 */
2 private function checkFileSize() {
3 if ($this->fileSize > $this->maxSize) {
4 $this->setOption(‘errorNum‘, -2);
5 return false;
6 }else{
7 return true;
8 }
9 }
1 /* 检查是否有存放上传文件的目录 */
2 private function checkFilePath() {
3 if(empty($this->path)){
4 $this->setOption(‘errorNum‘, -5);
5 return false;
6 }
7
8 if (!file_exists($this->path) || !is_writable($this->path)) {
9 if (!@mkdir($this->path, 0755)) {
10 $this->setOption(‘errorNum‘, -4);
11 return false;
12 }
13 }
14 return true;
15 }
1 /* 设置随机文件名 */
2 private function setRandName() {
3 $fileName = date(‘YmdHis‘)."_".rand(10, 999);
4 return $fileName.‘.‘.$this->fileType;
5 }
1 /* 移动上传文件到指定的位置 */
2 private function moveFile() {
3 if(!$this->errorNum) {
4 $path = rtrim($this->path, ‘/‘).‘/‘.$this->newFileName;
5 if (@move_uploaded_file($this->tmpFileName, $path)) {
6 return true;
7 }else{
8 $this->setOption(‘errorNum‘, -3);
9 return false;
10 }
11 } else {
12 return false;
13 }
14 }
1 /* 设置上传出错信息 */
2 private function getError() {
3 $str = "上传文件{$this->oldName}时出错 : ";
4 switch ($this->errorNum) {
5 case 4: $str .= "没有文件被上传"; break;
6 case 3: $str .= "文件只有部分被上传"; break;
7 case 2: $str .= "上传文件的大小超过了HTML表单中MAX_FILE_SIZE选项指定的值"; break;
8 case 1: $str .= "上传的文件超过了php.ini中upload_max_filesize选项限制的值"; break;
9 case -1: $str .= "未允许类型"; break;
10 case -2: $str .= "文件过大,上传的文件不能超过{$this->maxSize}个字节"; break;
11 case -3: $str .= "上传失败"; break;
12 case -4: $str .= "建立存放上传文件目录失败,请重新指定上传目录"; break;
13 case -5: $str .= "必须指定上传文件的路径"; break;
14 case -6: $str .= "文件不能同名"; break;
15 default: $str .= "未知错误";break;
16 }
17 return $str.‘
‘;
18 } 1 /**
2 * 调用该方法上传文件
3 * @param [type] $fileField [上传文件表单名称]
4 * @return [type] [上传成功返回true]
5 */
6 public function upload($fileField) {
7 $return = true;
8
9 /* 检查文件路径是否合法 */
10 if( !$this->checkFilePath() ) {
11 $this->errorMsg = $this->getError();
12 return false;
13 }
14
15 /* 将文件上传的信息取出赋给变量 */
16 $name = $_FILES[$fileField][‘name‘];
17 $tmp_name = $_FILES[$fileField][‘tmp_name‘];
18 $size = $_FILES[$fileField][‘size‘];
19 $error = $_FILES[$fileField][‘error‘];
20
21 /* 如果是多个文件上传则$file["name"]会是一个数组 */
22 if(is_Array($name)){
23 $errors = array();
24
25 /*多个文件上传则循环处理 , 这个循环只有检查上传文件的作用,并没有真正上传 */
26 for($i = 0; $i count($name); $i++){
27 /*设置文件信息 */
28 if($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i] )) {
29 if(!$this->checkFileSize() || !$this->checkFileType() || !$this->checkFileName()){
30 $errors[] = $this->getError();
31 $return = false;
32 }
33 }else{
34 $errors[] = $this->getError();
35 $return = false;
36 }
37
38 /* 如果有问题,则重新初使化属性 */
39 if(!$return){
40 $this->setFiles();
41 }
42 }
43
44 if($return){
45 /* 存放所有上传后文件名的变量数组 */
46 $fileNames = array();
47
48 /* 如果上传的多个文件都是合法的,则通过销魂循环向服务器上传文件 */
49 for($i = 0; $i count($name); $i++){
50 if($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i] )) {
51 $this->setNewFileName();
52 if(!$this->moveFile()){
53 $errors[] = $this->getError();
54 $return = false;
55 }
56 $fileNames[] = $this->newFileName;
57 }
58 }
59 $this->newFileName = $fileNames;
60 }
61 $this->errorMsg = $errors;
62 return $return;
63 /*上传单个文件处理方法*/
64 } else {
65 /* 设置文件信息 */
66 if($this->setFiles($name, $tmp_name, $size, $error)) {
67 /* 上传之前先检查一下大小和类型 */
68 if($this->checkFileSize() && $this->checkFileType() && $this->checkFileName()){
69 /* 为上传文件设置新文件名 */
70 $this->setNewFileName();
71 /* 上传文件 返回0为成功, 小于0都为错误 */
72 if($this->moveFile()){
73 return true;
74 }else{
75 $return = false;
76 }
77 }else{
78 $return = false;
79 }
80 } else {
81 $return = false;
82 }
83 //如果$return为false, 则出错,将错误信息保存在属性errorMsg中
84 if(!$return){
85 $this->errorMsg=$this->getError();
86 }
87 return $return;
88 }
89 }