首页 / PHP / 一个经典的PHP文件上传类
一个经典的PHP文件上传类
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了一个经典的PHP文件上传类,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含7720字,纯文字阅读大概需要12分钟。
内容图文
需求分析如下:
(1)支持单个文件上传
(2)支持多个文件上传
(3)可以指定保存位置 可以设置上传文件允许的大小和类型 可以选择重命名和保留原名
1 <!--
2 设计一个经典文件上传类
3 需求分析
4 (1)支持单个文件上传
5 (2)支持多个文件上传
6 (3)可以指定保存位置 可以设置上传文件允许的大小和类型 可以选择重命名和保留原名
7 程序设计
8 成员属性
9 成员方法
10 11 -->
12 13 <?php
14error_reporting(E_ALL && !E_NOTICE);
15 16class FileUpload{
17private$path = "./uploads";
18private$allowtype = array(‘jpg‘,‘gif‘,‘png‘,‘txt‘);
19private$maxsize = 1000000;
20private$israndname = true;//设置是否随机重命名文件 21 22private$originName;
23private$tmpFileName;
24private$fileType;
25private$fileSize;
26private$newFileName;
27private$errorNum = 0;
28private$errorMess = "";
29 30/**
31 * 用于设置成员属性
32 * 可以通过连贯操作设置多个值
33*/ 34function set($key,$val){
35$key = strtolower($key);
36if(array_key_exists($key,get_class_vars(get_class($this)))){
37$this -> setOption($key,$val);
38 }
39return$this;
40 }
41 42/**
43 * 用该函数来上传文件
44*/ 45function upload($fileField){
46$return = true;
47 48//检查文件路径是否合法 49if(!$this -> checkFilepath()){
50$this -> errorMess = $this -> errorMess();
51returnfalse;
52 }
53//将文件上传的信息取出赋值给变量 54$name = $_FILES[$fileField][‘name‘];
55$tmp_name = $_FILES[$fileField][‘tmp_name‘];
56$size = $_FILES[$fileField][‘size‘];
57$error = $_FILES[$fileField][‘error‘];
58 59//如果是多个上传文件则$file[‘name‘]是数组 60if(is_array($name)){
61$errors = array();
62//多个文件需要循环处理,此循环只有检查上传文件的作用,并没有真正上传 63for($i = 0;$i < count($name);$i ++){
64//设置文件信息 65if($this -> setFiles($name[$i],$tmp_name[$i],$size[$i],$error[$i])){
66if(!$this -> checkFileSize() || !$this -> checkFileType()){
67$error[] = $this -> getError();
68$return = false;
69 }
70 }else{
71$errors[] = $this -> getError();
72$return = false;
73 }
74//如果有问题,则重新初始化属性 75if(!$return)
76$this -> setFiles();
77 }
78 79if($return){
80//存放所有上传文件名的变量数组 81$fileNames = array();
82//如果上传的多个文件都是合法的 则通过循环向服务器上传文件 83for($i = 0;$i < count($name);$i ++){
84if($this -> setFiles($name[$i],$tmp_name[$i],$size[$i],$error[$i])){
85$this -> setNewfileName();
86if(!$this -> copyFile()){
87$errors[] = $this -> getError();
88$return = false;
89 }
90$filenames[] = $this -> newFileName;
91 }
92 }
93$this -> newFileName = $fileNames;
94 }
95$this -> errorMess = $errors;
96return$return;
97 }else{
98//设置文件信息 99if($this -> setFiles($name,$tmp_name,$size,$error)){
100//上传之前先判断一下大小和类型101if($this -> checkFileSize() && $this -> checkFileType()){
102//为上传文件设置新名103$this -> setNewfileName();
104//上传文件 成功返回true 失败返回false105if($this -> copyFile()){
106returntrue;
107 }else{
108$return = false;
109 }
110 }else{
111$return = false;
112 }
113 }else{
114$return = false;
115 }
116117//如果$return为false 则出错 将出错信息保存在属性errorMess中118if(!$return)
119$this -> errorMess = $this -> getError();
120return$return;
121 }
122 }
123124/**
125 * 获取上传后的文件名称
126*/127publicfunction getFileName(){
128return$this -> newFileName;
129 }
130131/**
132 * 上传失败后,调用该方法则调用该方法返回,上传出错信息
133*/134publicfunction getErrorMsg(){
135return$this -> errorMess;
136 }
137138//设置上传错误信息139privatefunction getError(){
140$str = "上传文件<font color = ‘red‘>{$this -> originName}</font>时出错 :";
141switch($this -> errorNum){
142case 4:$str .= "没有文件被上传";break;
143case 3:$str .= "文件只有部分被上传";break;
144case 2:$str .= "上传文件的大小超过了HTML表单中指定的值";break;
145case 1:$str .= "上传文件的大小超过了php.ini中指定的值";break;
146case -1:$str .= "未允许类型";break;
147case -2:$str .= "文件过大,上传的文件不能超过{$this -> maxsize}个字节";break;
148case -3:$str .= "上传失败";break;
149case -4:$str .= "建立存放上传文件目录失败,请重新指定上传目录";break;
150case -5:$str .= "必须指定上传文件的路径";break;
151default:$str .= "未知错误";
152 }
153return$str.‘<br>‘;
154 }
155156//设置和$_FILES有关的内容157privatefunction setFiles($name = "",$tmp_name = "",$size = "",$error = 0){
158$this -> setOption(‘errorNum‘,$error);
159if($error)
160returnfalse;
161$this -> setOption(‘originName‘,$name);
162$this -> setOption(‘tmpFileName‘,$tmp_name);
163$aryStr = explode(".",$name);
164$this -> setOption(‘fileType‘,strtolower($aryStr[count($aryStr) - 1]));
165$this -> setOption(‘fileSize‘,$size);
166returntrue;
167 }
168169//为单个成员属性设置值170privatefunction setOption($key,$val){
171$this -> $key = $val;
172 }
173174//设置上传后的文件名称175privatefunction setNewfileName(){
176if($this -> israndname){
177$this -> setOption(‘newFileName‘,$this -> proRandName());
178 }else{
179$this -> setOption(‘newFileName‘,$this -> originName);
180 }
181 }
182183//检查上传文件是否是合法的类型184privatefunction checkFileType(){
185if(in_array(strtolower($this -> fileType),$this -> allowtype)){
186returntrue;
187 }else{
188$this -> setOption(‘errorNum‘,-1);
189returnfalse;
190 }
191 }
192193//检查上传文件是否是允许的大小194privatefunction checkFileSize(){
195if($this -> fileSize > $this -> maxsize){
196$this -> setOption(‘errorNum‘,-2);
197returnfalse;
198 }else{
199returntrue;
200 }
201 }
202203//检查是否有存放上传文件的目录204privatefunction checkFilepath(){
205if(empty($this -> path)){
206$this -> setOption(‘errorNum‘,-5);
207returnfalse;
208 }
209if(!file_exists($this -> path) || !is_writable($this -> path)){
210if(!@mkdir($this -> path)){
211$this -> setOption(‘errorNum‘,-4);
212returnfalse;
213 }
214 }
215returntrue;
216 }
217218//设置随机文件名219privatefunction proRandName(){
220$filename = date(‘YmdHis‘)."_".rand(100,999);
221return$filename.".".$this -> fileType;
222 }
223224//复制上传文件到指定位置225privatefunction copyFile(){
226if(!$this -> errorNum){
227$path = rtrim($this -> path,‘/‘).‘/‘;
228$path .= $this -> newFileName;
229if(@move_uploaded_file($this -> tmpFileName,$path)){
230returntrue;
231 }else{
232$this -> setOption(‘errorNum‘,-3);
233returnfalse;
234 }
235 }else{
236returnfalse;
237 }
238 }
239240241242243 }
244 ?>
上面为一个文件上传类 想要用到这个类需要另写一个PHP文件来调用该类
内容如下
1 <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> 2 3 <?php 4/** 5 使用文件上传类fileupload.class.php 处理单个或多个文件上传 6*/ 7 8error_reporting(E_ALL && !E_NOTICE); 9require "fileupload.class.php";//将文件上传类的文件包含进来1011$up = new FileUpload; 1213//可以通过set方法设置上传的属性 设置多个属性set方法可以单独调用 也可以连贯操作一起调用多个14/* $up -> set(‘path‘,‘./newpath/‘) 15 -> set(‘size‘,1000000) 16 -> set(‘allowtype‘,array(‘gif‘,‘png‘,‘jpg‘,‘txt‘)) 17 -> set(‘israndname‘,false); 18*/19//调用$up对象的upload方法上传文件 myfile是表单的名称 上传成功返回true 否则返回false20if($up -> upload(‘myFile‘)){ 21//如果是多个文件 返回数组 存放所有上传后的文件名 单文件上传则直接返回文件名称22print_r($up -> getFileName()); 23 }else{ 24//如果是多个文件 返回数组 多条出错信息 单文件上传则直接返回一条错误报告25print_r($up -> getErrorMsg()); 26 } 27 ?>
然后在写一个HTML文件作为前端 使用上面运用到文件上传类的文件
单文件上传:
1 < meta http-equiv ="Content-Type" content ="text/html;charset=utf-8" > 2 < html > 3 < head >< title >单个文件上传</title></head> 4 5<body> 6<form action = "upload.php" method = "POST" enctype = "multipart/form-data"> 7<input type = "hidden" name = "MAXN_FILIE_SIZE" value = "100000"> 8 选择文件:<input type = "file" name = "myFile"> 9<input type = "submit" value = "上传文件">10</form>11</body>12</html>
多文件上传:
1 < meta http-equiv ="Content-Type" content ="text/html;charset=utf-8" > 2 < html > 3 < head >< title >单个文件上传</title></head> 4 5<body> 6<form action = "upload.php" method = "POST" enctype = "multipart/form-data"> 7<input type = "hidden" name = "MAXN_FILIE_SIZE" value = "100000"> 8 选择文件1:<input type = "file" name = "myFile[]"> 9 选择文件2:<input type = "file" name = "myFile[]">10 选择文件3:<input type = "file" name = "myFile[]">11<input type = "submit" value = "上传文件">12</form>1314</body>15</html>
原文:http://www.cnblogs.com/banshaohuan/p/4987491.html
内容总结
以上是互联网集市为您收集整理的一个经典的PHP文件上传类全部内容,希望文章能够帮你解决一个经典的PHP文件上传类所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。