首页 | 源码下载 | 网站模板 | 网页特效 | 广告代码 | 网页素材 | 字体下载 | 书库 | 站长工具
会员投稿 投稿指南 RSS订阅
当前位置:主页>网络编程>PHP教程>资讯:PHP好用文件上传类——单文件多文件上传

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

www.jz123.cn  2012-10-19   来源:   站长家园    责任编辑(袁袁)    我要投递新闻

今天看了一下百度指数,发现原来“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<count($name);$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<count($name);$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('errorNum',-1);
                return false;
            }else{
                return true;
            }
        }
        //检查文件类型
        protected function checkType(){
            if(!in_array($this->fileType,$this->allowtype)){
                $this->setOption('errorNum',-2);
                return false;
            }else{
                return true;
            }
        }
        //设置_FILES相关信息
        protected function setFiles($name='',$error=0,$size=0,$tmp_name=''){
            $this->setOption('errorNum',$error);
            if($error){
                return false;
            }
            $this->setOption('originName',$name);
            $this->setOption('tempName',$tmp_name);
            $type = explode('.',$name);
            $this->setOption('fileType',strtolower($type[count($type)-1]));
            $this->setOption('filesize',$size);
            return true;
        }
        //获取错误信息
        protected function getError(){
            $str = '文件上<span style="color:red;">'.$this->originName.'</span>传出错:';
            switch($this->errorNum){
                case 1:
                    $str .= '上传文件超过了php.ini中upload_max_filesize选项的值';
                    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 .= '上传失败';
                    break;
                case -4:
                    $str .= '目录创建失败,请重新设置上传目录';
                    break;
                case -5:
                    $str .= '上传目标地址不能为空';
                    break;
                default:
                    $str .= '上传失败,发现未知错误';
            }
            return $str.'<br>';
        }
        //上传路径检测
        protected function checkPath(){
            //路径为空
            if(empty($this->path)){
                $this->setOption('errorNum',-5);
                return false;
            }
            //路径不存在或不可写
            if(!file_exists($this->path) || !is_writable($this->path)){
                if(!@mkdir($this->path,0755)){
                    $this->setOption('errorNum',-4);
                    return false;
                }
            }
            return true;
        }
        //初始化数据,赋值函数
        private function setOption($key,$value){
            $this->$key = $value;
        }
    }

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


上一篇:再谈PHP单双引号问题 下一篇:PHP PDOStatement::bindParam的一个陷阱

评论总数:0 [ 查看全部 ] 网友评论


关于我们隐私版权广告服务友情链接联系我们网站地图