php实现文件上传

存档:

upload1.html(单文件上传)

 1 <html>
 2     <head>
 3         <title>单个文件上传</title>
 4     </head>
 5     <body>
 6         <form action="upload.php" method="post" enctype="multipart/form-data">
 7             <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
 8             选择文件:<input type="file" name="myfile">
 9             <input type="submit" value="上传文件">
10         </form>
11     </body>
12 </html>

upload2.html(多文件上传)

 1 <html>
 2     <head>
 3         <title>多文件上传</title>
 4     </head>
 5     <body>
 6         <form action="upload.php" method="post" enctype="multipart/form-data">
 7             <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
 8             选择文件1:<input type="file" name="myfile[]"><br>
 9             选择文件2:<input type="file" name="myfile[]"><br>
10             选择文件3:<input type="file" name="myfile[]"><br>
11             <input type="submit" value="上传文件">
12         </form>
13     </body>
14 </html>

upload.php

 1 <?php
 2     require "fileupload.class.php";
 3     $up=new FileUpload;
 4     $up ->set('path','./newpath/')
 5         ->set('size',1000000)
 6         ->set('allowtype',array('gif','jpg','png'))
 7         ->set('israndname',false);
 8     if($up->upload('myfile')){
 9         print_r($up->getFileName());
10     }
11     else{
12         print_r($up->getErrorMsg());
13     }
14 ?>

fileupload.class.php

  1 <?php
  2     class FileUpload{
  3         private $path="./uploads";
  4         private $allowtype=array('jpg','gif','png');
  5         private $maxsize=1000000;
  6         private $israndname=true;
  7         private $originName;
  8         private $tmpFileName;
  9         private $fileType;
 10         private $fileSize;
 11         private $newFileName;
 12         private $errorNum=0;
 13         private $errorMess="";
 14         
 15         function set($key,$val){
 16             $key=strtolower($key);
 17             if(array_key_exists($key,get_class_vars(get_class($this)))){
 18                 $this->setOption($key,$val);
 19             }
 20             return $this;
 21         }
 22         
 23         function upload($fileField){
 24             $return=true;
 25             if(!$this->checkFilePath()){
 26                 $this->errorMess=$this->getError();
 27                 return false;
 28             }
 29             $name=$_FILES[$fileField]['name'];
 30             $tmp_name=$_FILES[$fileField]['tmp_name'];
 31             $size=$_FILES[$fileField]['size'];
 32             $error=$_FILES[$fileField]['error'];
 33             if(is_Array($name)){
 34                 $errors=array();
 35                 for($i=0;$i<count($name);$i++){
 36                     if($this->setFiles($name[$i],$tmp_name[$i],$size[$i],$error[$i])){
 37                         if(!$this->checkFileSize()||!$this->checkFileType()){
 38                             $errors[]=$this->getError();
 39                             $return=false;
 40                         }
 41                     }
 42                     else{
 43                         $errors[]=$this->getError();
 44                         $return=false;
 45                     }
 46                     if(!$return){
 47                         $this->setFiles();
 48                     }
 49                 }
 50                 if($return){
 51                     $fileNames=array();
 52                     for($i=0;$i<count($name);$i++){
 53                         if($this->setFiles($name[$i],$tmp_name[$i],$size[$i],$error[$i])){
 54                             $this->setNewFileName();
 55                             if(!$this->copyFile()){
 56                                 $errors[]=$this->getError();
 57                                 $return=false;
 58                             }
 59                             $fileNames[]=$this->newFileName;
 60                         }
 61                     }
 62                     $this->newFileName=$fileNames;
 63                 }
 64                 $this->errorMess=$errors;
 65                 return $return;
 66             }
 67             else{
 68                 if($this->setFiles($name,$tmp_name,$size,$error)){
 69                     if($this->checkFileSize()&&$this->checkFileType()){
 70                         $this->setNewFileName();
 71                         if($this->copyFile()){
 72                             return true;
 73                         }
 74                         else{
 75                             $return=false;
 76                         }
 77                     }
 78                     else{
 79                         $return=false;
 80                     }
 81                 }
 82                 else{
 83                     $return=false;
 84                 }
 85                 if(!$return){
 86                     $this->errorMess=$this->getError();
 87                 }
 88                 return $return;
 89             }
 90         }
 91         
 92         public function getFileName(){
 93             return $this->newFileName;
 94         }
 95         
 96         public function getErrorMsg(){
 97             return $this->errorMess;
 98         }
 99         
100         private function getError(){
101             $str="上传文件<font color='red'>{$this->originName}</font>时出错:";
102             switch($this->errorNum){
103                 case 4:
104                     $str.="没有文件被上传";
105                     break;
106                 case 3:
107                     $str.="文件只有部分被上传";
108                     break;
109                 case 2:
110                     $str.="上传的文件大小超过了HTML表单中MAX_FILE_SIZE选项指定的值";
111                     break;
112                 case 1:
113                     $str.="上传的文件超过了php.ini中的upload_max_filesize选定限制的值";
114                     break;
115                 case -1:
116                     $str.="未允许类型";
117                     break;
118                 case -2:
119                     $str.="文件过大,上传的文件不能超过{$this->maxsize}个字节";
120                     break;
121                 case -3:
122                     $str.="上传失败";
123                     break;
124                 case -4:
125                     $str.="建立存放上传文件目录失败,请重新指定上传目录";
126                     break;
127                 case -5:
128                     $str.="必须指定上传文件的路径";
129                     break;
130                 default:
131                     $str.="未知错误";
132                     //break;
133             }
134             return $str.'<br>';
135         }
136         
137         private function setFiles($name="",$tmp_name="",$size=0,$error=0){
138             $this->setOption('errorNum',$error);
139             if($error){
140                 return false;
141             }
142             $this->setOption('originName',$name);
143             $this->setOption('tmpFileName',$tmp_name);
144             $aryStr=explode(".",$name);
145             $this->setOption('fileType',strtolower($aryStr[count($aryStr)-1]));
146             $this->setOption('fileSize',$size);
147             return true;
148         }
149         
150         private function setOption($key,$val){
151             $this->$key=$val;
152         }
153         
154         private function setNewFileName(){
155             if($this->israndname){
156                 $this->setOption('newFileName',$this->proRandName());
157             }
158             else{
159                 $this->setOption('newFileName',$this->originName);
160             }
161         }
162         
163         private function checkFileType(){
164             if(in_array(strtolower($this->fileType),$this->allowtype)){
165                 return true;
166             }
167             else{
168                 $this->setOption('errorNum',-1);
169                 return false;
170             }
171         }
172         
173         private function checkFileSize(){
174             if($this->fileSize>$this->maxsize){
175                 $this->setOption('errorNum',-2);
176                 return false;
177             }
178             else{
179                 return true;
180             }
181         }
182         
183         private function checkFilePath(){
184             if(empty($this->path)){
185                 $this->setOption('errorNum',-5);
186                 return false;
187             }
188             if(!file_exists($this->path)||!is_writable($this->path)){
189                 if(!@mkdir($this->path,0755)){
190                     $this->setOption('errorNum',-4);
191                     return false;
192                 }
193             }
194             return true;
195         }
196         
197         private function proRandName(){
198             $fileName = date('YmdHis')."_".rand(100,999);
199             return $fileName.'.'.$this->fileType;
200         }
201         
202         private function copyFile(){
203             if(!$this->errorNum){
204                 $path=rtrim($this->path,'/').'/';
205                 $path.=$this->newFileName;
206                 if(@move_uploaded_file($this->tmpFileName,$path)){
207                     return true;
208                 }
209                 else{
210                     $this->setOption('errorNum',-3);
211                     return false;
212                 }
213             }
214             else{
215                 return false;
216             }
217         }
218     }
219 ?>

结果如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • php实现图形计算器

    存档: index.php 1 <html> 2 <head> 3 <title>图形计算器开发</title> 4 ...

    Angel_Kitty
  • 【Java学习笔记之十四】Java中this用法小节

    用类名定义一个变量的时候,定义的只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法。     那们类里面是够也应该有一个引用来访问自己的属性和方法纳...

    Angel_Kitty
  • 用php做个简单的日历

    存档: index.php 1 <html> 2 <head> 3 <title>日历</title> 4 <s...

    Angel_Kitty
  • 《JavaScript 模式》读书笔记(5)— 对象创建模式4

    JavaScript中没有常量的概念,虽然许多现代的编程环境可能为您提供了用以创建常量的const语句。作为一种变通方案,JavaScript中常见的一种方法...

    zaking
  • 聊聊spring cloud的FeignClientFactoryBean

    本文主要研究一下spring cloud的FeignClientFactoryBean

    codecraft
  • PHP示例演示发送邮件给某个邮箱

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对ZaLou.Cn的支持。

    砸漏
  • jquery validate 如何校验多个相同name

    本文来源 : http://www.cnblogs.com/danywdd/p/5667903.html

    翟凤玺
  • 聊聊spring cloud的FeignClientFactoryBean

    本文主要研究一下spring cloud的FeignClientFactoryBean

    codecraft
  • 基于 Vue 的商品主图放大镜方案

    在做电商类应用时,难免会遇到商品主图实现放大镜效果的场景,现有的基于Vue的第三方包不多并且无法直接复用,今天,我来分享一种高稳定性的基于 Vue 的图片放大镜...

    政采云前端团队
  • difference between view exit and view destroy

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券