当前位置:  开发笔记 > 编程语言 > 正文

PHP好用文件上传类——单文件多文件上传

今天看了一下百度指数,发现原来php文件怎么打开这个关键词居然还挺多人搜索的,于是想起了自己刚开始学习PHP的时候傻乎乎的,什么都不会,老师讲那么多自己学那么多,之后发现什么也没学到(相信很多童鞋跟我也...">

 

今天看了一下百度指数,发现原来“php文件怎么打开”这个关键词居然还挺多人搜索的,于是想起了自己刚开始学习PHP的时候傻乎乎的,什么都不会,老师讲那么多自己学那么多,之后发现什么也没学到(wlEmoticon cryingface PHP好用文件上传类——单文件多文件上传相信很多童鞋跟我也是一样吧),接触了一段时间后发现PHP不是很难,但要学精通不容易啊,遂开始发奋,这不,今天写了个PHP的类来练练手,随便也给同样是新手的童鞋一点我学习的经验,在学习PHP过程中肯定会学习到文件上传相关知识,PHP上传在程序中经常使用,今天弄了一个文件上传类,是参照高洛峰老师的视频写的,非常好用,同时简单修改了一下,这个类可以实现单文件、多文件的上传,如果有大神,拍砖请轻点……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
class FileUpload{
        protected $path;                                                   //文件保存路径
        protected $size = 2000000;                                         //上传文件限制大小,默认为2M
        protected $allowtype = array('jpg','gif','png','bmp','tif');       //可上传文件格式
        protected $israndname = true;                                      //是否修改文件名
        protected $tempName;                                               //临时文件名
 
        protected $originName;                                             //源文件名
        protected $fileType;                                               //上传文件类型
        protected $filesize;                                               //上传文件大小
        protected $newName;                                                //新文件名
        protected $errorNum = 0;                                           //错误代码
        protected $errorMass;                                              //错误信息
        //初始化各项设置
        function __construct($option = array()){
            foreach($option as $key=>$value){
                $key = strtolower($key);
                //检测各个配置项是否存在
                if(!in_array($key,get_class_vars(get_class($this)))){
                    continue;
                }
                $this->setOption($key,$value);
            }
        }
        //上传函数
        public function uploadFile($fileField){
            $return = true;
            if(!$this->checkPath()){
                $this->errorMess = $this->getError();
                return false;  
            }
            
            $name = $_FILES[$fileField]['name'];
            $error = $_FILES[$fileField]['error'];
            $size = $_FILES[$fileField]['size'];
            $tmp_name = $_FILES[$fileField]['tmp_name'];
            
            if(is_array($name)){
                $errors = array();
                for($i=0;$i
                    if(empty($name[$i])){
                        continue;
                    }
                    if($this->setFiles($name[$i],$error[$i],$size[$i],$tmp_name[$i])){
                        if(!$this->checkSize() || !$this->checkType()){
                            $errors[] = $this->getError();
                            $return = false;
                        }
                    }else{
                        $errors[] = $this->getError();
                        $return = false;
                    }
                }
                
                if($return){
                    $fileName = array();
                    for($i=0;$i
                        if($this->setFiles($name[$i],$error[$i],$size[$i],$tmp_name[$i])){
                            $this->setNewFileName();
                            if(!$this->copyFile()){
                                $errors[] = $this->getError();
                                $return = false;
                            }else{
                                $fileName[] = $this->newName;
                            }
                        }
                    }
                    $this->newName = $fileName;
                }
                $this->errorMess = $errors;
                return $return;
            }else{
                if($this->setFiles($name,$error,$size,$tmp_name)){
                    if($this->checkSize() && $this->checkType()){
                        $this->setNewFileName();
                        if($this->copyFile()){
                            return true;
                        }else{
                            $return = false;
                        }
                    }else{
                        $return = false;
                    }
                }else{
                    $return = false;
                }
                
                if(!$return){
                    $this->errorMess = $this->getError();
                }
                return $return;
            }
        }
        //获取错误信息
        public function getErrorMesg(){
            return $this->errorMess;
        }
        //获取上传后文件名
        public function getNewName(){
            return $this->newName;
        }
        //复制保存文件
        protected function copyFile(){
            if(!$this->errorNum){
                $filepath = rtrim($this->path,'/').'/';
                $filepath .= $this->newName;
                if(@move_uploaded_file($this->tempName,$filepath)){
                    return true;
                }else{
                    $this->setOption('errorNum',-3);
                    return false;
                }
            }
        }
        //设置新文件名
        protected function setNewFileName(){
            if($this->israndname){
                $this->setOption('newName',$this->randName());
            }
            else{
                $this->setOption('newName',$this->originName);
            }
        }
        //产生随机文件名
        private function randName(){
            $str = date('YmdHis').rand(1000,9999);
            return $str.'.'.$this->fileType;
        }
        //检查文件大小是否超出允许上传文件大小
        protected function checkSize(){
            if($this->size<$this->filesize){
                $this->setOption(&#39;errorNum&#39;,-1);
                return false;
            }else{
                return true;
            }
        }
        //检查文件类型
        protected function checkType(){
            if(!in_array($this->fileType,$this->allowtype)){
                $this->setOption(&#39;errorNum&#39;,-2);
                return false;
            }else{
                return true;
            }
        }
        //设置_FILES相关信息
        protected function setFiles($name=&#39;&#39;,$error=0,$size=0,$tmp_name=&#39;&#39;){
            $this->setOption(&#39;errorNum&#39;,$error);
            if($error){
                return false;
            }
            $this->setOption(&#39;originName&#39;,$name);
            $this->setOption(&#39;tempName&#39;,$tmp_name);
            $type = explode(&#39;.&#39;,$name);
            $this->setOption(&#39;fileType&#39;,strtolower($type[count($type)-1]));
            $this->setOption(&#39;filesize&#39;,$size);
            return true;
        }
        //获取错误信息
        protected function getError(){
            $str = &#39;文件上&#39;.$this->originName.&#39;传出错:&#39;;
            switch($this->errorNum){
                case 1:
                    $str .= &#39;上传文件超过了php.ini中upload_max_filesize选项的值&#39;;
                    break;
                case 2:
                    $str .= &#39;上传文件超过了HTML表单中MAX_FILE_SIZE选项指定的值&#39;;
                    break;
                case 3:
                    $str .= &#39;文件只被部分上传&#39;;
                    break;
                case 4:
                    $str .= &#39;没有文件被上传&#39;;
                    break;
                case -1:
                    $str .= &#39;文件大小超出允许上传文件大小&#39;;
                    break;
                case -2:
                    $str .= &#39;上传的文件类型不是被允许的类型&#39;;
                    break;
                case -3:
                    $str .= &#39;上传失败&#39;;
                    break;
                case -4:
                    $str .= &#39;目录创建失败,请重新设置上传目录&#39;;
                    break;
                case -5:
                    $str .= &#39;上传目标地址不能为空&#39;;
                    break;
                default:
                    $str .= &#39;上传失败,发现未知错误&#39;;
            }
            return $str.&#39;
&#39;;
        }
        //上传路径检测
        protected function checkPath(){
            //路径为空
            if(empty($this->path)){
                $this->setOption(&#39;errorNum&#39;,-5);
                return false;
            }
            //路径不存在或不可写
            if(!file_exists($this->path) || !is_writable($this->path)){
                if(!@mkdir($this->path,0755)){
                    $this->setOption(&#39;errorNum&#39;,-4);
                    return false;
                }
            }
            return true;
        }
        //初始化数据,赋值函数
        private function setOption($key,$value){
            $this->$key = $value;
        }
    }

代码有点长,请的家见谅哈,不过学习PHP看长代码也是必经的一个阶段,必经天才不多嘛,嘿嘿……


推荐阅读
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • 在第六章中,我们将深入探讨MySQL中的多表查询技术,包括联结查询和子查询。联结查询通过将两个或多个表进行连接,基于连接条件生成结果集。常见的联结类型有内联结、外联结和全外联结。交叉联结(CROSS JOIN)虽然使用较少,但其原理是生成所有可能的组合,类似于笛卡尔积的概念。此外,子查询则是在一个查询语句中嵌套另一个查询,用于获取更复杂的数据集。本章将通过实例详细讲解这些查询方法的应用和优化技巧。 ... [详细]
  • Vue项目上线后遇到的问题及解决方案 ... [详细]
  • 如何在PHP中提取数字的特定位数值
    本文将详细介绍如何在PHP中提取数字的特定位置的数值。这一技巧对于数据处理和算法实现具有重要意义,通过实例代码和详细解析,帮助读者掌握该方法的应用场景和实现方式。 ... [详细]
  • 本文深入探讨了 iOS 开发中 `int`、`NSInteger`、`NSUInteger` 和 `NSNumber` 的应用与区别。首先,我们将详细介绍 `NSNumber` 类型,该类用于封装基本数据类型,如整数、浮点数等,使其能够在 Objective-C 的集合类中使用。通过分析这些类型的特性和应用场景,帮助开发者更好地理解和选择合适的数据类型,提高代码的健壮性和可维护性。苹果官方文档提供了更多详细信息,可供进一步参考。 ... [详细]
  • PHP图床源码:集成化图床管理系统解决方案
    本项目提供了一套集成化的图床管理系统解决方案,适用于需要高效管理图片资源的场景。系统结构简洁,无需复杂的后台支持。主要文件包括 `huluxia.php`、`index.html`、`inews.php`、`kw.php` 和 `zz.php`,每个文件都承担了特定的功能,确保系统的稳定运行和易用性。 ... [详细]
  • 解决基于XML配置的MyBatis在Spring整合中出现“无效绑定语句(未找到):com.music.dao.MusicDao.findAll”问题的方法
    在将Spring与MyBatis进行整合时,作者遇到了“无效绑定语句(未找到):com.music.dao.MusicDao.findAll”的问题。该问题主要出现在使用XML文件配置DAO层的情况下,而注解方式配置则未出现类似问题。作者详细分析了两个配置文件之间的差异,并最终找到了解决方案。本文将详细介绍问题的原因及解决方法,帮助读者避免类似问题的发生。 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 在 HihoCoder 1505 中,题目要求从给定的 n 个数中选取两对数,使这两对数的和相等。如果直接对所有可能的组合进行遍历,时间复杂度将达到 O(n^4),因此需要考虑优化选择过程。通过使用哈希表或其他高效的数据结构,可以显著降低时间复杂度,从而提高算法的效率。具体实现中,可以通过预处理和存储中间结果来减少重复计算,进一步提升性能。 ... [详细]
  • 在探讨如何高效处理大规模数据报表的分页展示之前,首先需要明确导致报表加载缓慢的主要原因。通常情况下,这主要是由于两个方面:一是查询条件过于宽泛,使得数据库返回的结果集包含数百万甚至更多的记录;二是前端渲染性能不足,无法高效处理大量数据。为了优化这一过程,可以从以下几个方面入手:优化查询条件,减少不必要的数据返回;采用分页查询技术,每次仅加载所需的数据;利用缓存机制,减少对数据库的频繁访问;提升前端渲染效率,使用虚拟滚动等技术提高用户体验。 ... [详细]
  • 在Linux环境下,本文详细探讨了Apache服务器中CGI技术的应用与实现。首先,通过使用yum包管理器安装了必要的软件,如PHP。安装完成后,对Apache服务器进行了配置,确保CGI功能正常运行。此外,还介绍了如何编写和调试CGI脚本,以及如何在实际环境中部署这些脚本以提供动态网页内容。实验结果表明,通过合理的配置和优化,Apache服务器能够高效地支持CGI应用程序,为用户提供丰富的交互体验。 ... [详细]
  • 本文深入解析了 Apache 配置文件 `httpd.conf` 和 `.htaccess` 的优化方法,探讨了如何通过合理配置提升服务器性能和安全性。文章详细介绍了这两个文件的关键参数及其作用,并提供了实际应用中的最佳实践,帮助读者更好地理解和运用 Apache 配置。 ... [详细]
  • Vuex 实战进阶:构建高效笔记本应用(第二篇)
    在上一篇文章中,我们初步探讨了 Vuex 在该项目中的应用。本文将深入解析整个项目的架构设计。首先回顾 `main.js` 的内容,然后重点分析 `App.vue` 文件,其中引入了 `Toolbar.vue` 和 `NodeList.vue` 组件,详细说明它们在应用中的作用和交互方式。通过这些组件的协同工作,我们将展示如何构建一个高效且响应迅速的笔记本应用。 ... [详细]
  • React组件是构成用户界面的基本单元,每个组件都封装了特定的功能和逻辑,具备高度的独立性和可复用性。通过将不同大小和功能的组件组合在一起,可以构建出复杂且功能丰富的页面,类似于拼图游戏中的各个部分,最终形成一个完整的视觉效果。 ... [详细]
  • 浅析PHP中$_SERVER[
    在PHP后端开发中,`$_SERVER["HTTP_REFERER"]` 是一个非常有用的超级全局变量,它可以获取用户访问当前页面之前的URL。本文将详细介绍该变量的使用方法及其在不同场景下的应用,如页面跳转跟踪、安全验证和用户行为分析等。通过实例解析,帮助开发者更好地理解和利用这一功能。 ... [详细]
author-avatar
月舞B的啊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有