当前位置:首页 > PHP教程 > php上传下载 > 列表

PHP实现文件上传与下载实例与总结

发布:smiling 来源: PHP粉丝网  添加日期:2021-07-14 09:45:38 浏览: 评论:0 

这篇文章主要介绍了PHP实现文件上传与下载实例与总结的相关资料,需要的朋友可以参考下。

一、上传原理与配置

1.1 原理

将客户端文件上传到服务器端,再将服务器端的文件(临时文件)移动到指定目录即可。

1.2 客户端配置

所需:表单页面(选择上传文件);

具体而言:发送方式为POST,添加enctype="multipart/form-data"属性,两者缺一不可(但是,优缺点并存,这里也限定了上传的方式和上传的文件之后的调用等方面,后面会说到)

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
  2. <html> 
  3. <head> 
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
  5. <title>Insert title here</title> 
  6. </head> 
  7. <body> 
  8. <form action="doAction.php" method="post" enctype="multipart/form-data"> 
  9. 请选择您要上传的文件: 
  10. <input type="file" name="myFile" /><br/> 
  11. <input type="submit" value="上传"/> 
  12. </form> 
  13. <?php 
  14.  
  15. ?> 
  16. </body> 
  17. </html> 

先是表单页面(请自动忽略前端问题。。。),关键就是form的属性;另外就是input 中用到了type="file"这一点(体现到php的强大的拓展等等)。

然后是doAction:

  1. <?php 
  2. //$_FILES:文件上传变量 
  3. //print_r($_FILES); 
  4. $filename=$_FILES['myFile']['name']; 
  5. $type=$_FILES['myFile']['type']; 
  6. $tmp_name=$_FILES['myFile']['tmp_name']; 
  7. $size=$_FILES['myFile']['size']; 
  8. $error=$_FILES['myFile']['error']; 
  9.  
  10. //将服务器上的临时文件移动到指定位置 
  11. //方法一move_upload_file($tmp_name,$destination) 
  12. //move_uploaded_file($tmp_name, "uploads/".$filename);//文件夹应提前建立好,不然报错 
  13. //方法二copy($src,$des) 
  14. //以上两个函数都是成功返回真,否则返回false 
  15. //copy($tmp_name, "copies/".$filename); 
  16. //注意,不能两个方法都对临时文件进行操作,临时文件似乎操作完就没了,我们试试反过来 
  17. copy($tmp_name"copies/".$filename); 
  18. move_uploaded_file($tmp_name"uploads/".$filename); 
  19. //能够实现,说明move那个函数基本上相当于剪切;copy就是copy,临时文件还在 
  20.  
  21. //另外,错误信息也是不一样的,遇到错误可以查看或者直接报告给用户 
  22. if ($error==0) { 
  23.   echo "上传成功!"
  24. }else
  25.   switch ($error){ 
  26.     case 1: 
  27.       echo "超过了上传文件的最大值,请上传2M以下文件"
  28.       break
  29.     case 2: 
  30.       echo "上传文件过多,请一次上传20个及以下文件!"
  31.       break
  32.     case 3: 
  33.       echo "文件并未完全上传,请再次尝试!"
  34.       break
  35.     case 4: 
  36.       echo "未选择上传文件!"
  37.       break
  38.     case 5: 
  39.       echo "上传文件为0"
  40.       break
  41.   } 

先把print_r($_FILES)这个信息看一下

  1. Array 
  2.   [myFile] => Array 
  3.     ( 
  4.       [name] => 梁博_简历.doc 
  5.       [type] => application/msword 
  6.       [tmp_name] => D:\wamp\tmp\php1D78.tmp 
  7.       [error] => 0 
  8.       [size] => 75776 
  9.     ) 
  10.  

所以得到的是个二维数组,该怎么用,都是基本的东西(其实我喜欢降维再用);

基本是一眼就懂的东西,不罗嗦,关键有两个:tmp_name临时文件名;error报错信息(代号,后面可以利用);

然后这里看一下doAction后面一部分,利用报错信息来反馈给用户,需要说明的是为什么报错,和报错信息是什么都;

1.3 关于报错

--报错原因

基本上都是超过或者不符合服务器关于上传文件的配置,那么服务器端配置有哪些呢?

先考虑上传我们用了什么?POST,upload

所以在php.ini中找这么几项:

file_upload:On

upload_tmp_dir=——临时文件保存目录;

upload_max_filesize=2M

max_file_uploads=20——允许一次上传的最大文件数量(注意和上面那个的区别,有没有size,别乱想)

post_max_size=8M——post方式发送数据的最大值

其他相关配置

max_exectuion_time=-1——最大执行时间,避免程序不好占用服务器资源;

max_input_time=60

max_input_nesting_level=64——输入嵌套深度;

memory_limit=128M——最大单线程的独立内存使用量

总之都是有关资源的配置。

--错误号

以下(偷懒)引自http://blog.sina.com.cn/s/blog_3cdfaea201008utf.html

UPLOAD_ERR_OK             值:0; 没有错误发生,文件上传成功。

UPLOAD_ERR_INI_SIZE      值:1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。

UPLOAD_ERR_FORM_SIZE  值:2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。

UPLOAD_ERR_PARTIAL          值:3; 文件只有部分被上传。

UPLOAD_ERR_NO_FILE          值:4; 没有文件被上传。

注意:这个错误信息是第一步上传的信息,也就是上传到临时文件夹的情况,而不是move或者copy的情况。

二、上传相关限制

2.1 客户端限制

  1. <form action="doAction2.php" method="post" enctype="multipart/form-data"> 
  2. <input type="hidden" name="MAX_FILE_SIZE" value="101321" /> 
  3. 请选择您要上传的文件: 
  4. <input type="file" name="myFile" accept="image/jpeg,image/gif,text/html"/><br/> 
  5. <input type="submit" value="上传"/> 
  6. </form> 

这里用input的属性对上传文件的大小和类型进行了限制,但是个人感觉:一,html代码是“可见的”;二,常不起作用(没找到原因,但因为第一个我也想放弃它,知道就好。

2.2 服务器端限制

主要限制大小和类型,再有就是方式。

  1. <?php 
  2. header('content-type:text/html;charset=utf-8'); 
  3. //接受文件,临时文件信息 
  4. $fileinfo=$_FILES["myFile"];//降维操作 
  5. $filename=$fileinfo["name"]; 
  6. $tmp_name=$fileinfo["tmp_name"]; 
  7. $size=$fileinfo["size"]; 
  8. $error=$fileinfo["error"]; 
  9. $type=$fileinfo["type"]; 
  10.  
  11. //服务器端设定限制 
  12. $maxsize=10485760;//10M,10*1024*1024 
  13. $allowExt=array('jpeg','jpg','png','tif');//允许上传的文件类型(拓展名 
  14. $ext=pathinfo($filename,PATHINFO_EXTENSION);//提取上传文件的拓展名 
  15.  
  16. //目的信息 
  17. $path="uploads"
  18. if (!file_exists($path)) {  //当目录不存在,就创建目录 
  19.   mkdir($path,0777,true); 
  20.   chmod($path, 0777); 
  21. //$destination=$path."/".$filename; 
  22. //得到唯一的文件名!防止因为文件名相同而产生覆盖 
  23. $uniName=md5(uniqid(microtime(true),true)).$ext;//md5加密,uniqid产生唯一id,microtime做前缀 
  24.  
  25. if ($error==0) { 
  26.   if ($size>$maxsize) { 
  27.     exit("上传文件过大!"); 
  28.   } 
  29.   if (!in_array($ext$allowExt)) { 
  30.     exit("非法文件类型"); 
  31.   } 
  32.   if (!is_uploaded_file($tmp_name)) { 
  33.     exit("上传方式有误,请使用post方式"); 
  34.   } 
  35.   if (@move_uploaded_file($tmp_name$uniName)) {//@错误抑制符,不让用户看到警告 
  36.     echo "文件".$filename."上传成功!"
  37.   }else
  38.     echo "文件".$filename."上传失败!"
  39.   } 
  40.   //判断是否为真实图片(防止伪装成图片的病毒一类的 
  41.   if (!getimagesize($tmp_name)) {//getimagesize真实返回数组,否则返回false 
  42.     exit("不是真正的图片类型"); 
  43.   } 
  44.  
  45. }else
  46.   switch ($error){ 
  47.     case 1: 
  48.       echo "超过了上传文件的最大值,请上传2M以下文件"
  49.       break
  50.     case 2: 
  51.       echo "上传文件过多,请一次上传20个及以下文件!"
  52.       break
  53.     case 3: 
  54.       echo "文件并未完全上传,请再次尝试!"
  55.       break
  56.     case 4: 
  57.       echo "未选择上传文件!"
  58.       break
  59.     case 7: 
  60.       echo "没有临时文件夹"
  61.       break
  62.   } 

这里,具体实现都有注释,每一步其实都可以自己试试的,很有趣。

2.3 封装

函数

  1. <?php 
  2. function uploadFile($fileInfo,$path,$allowExt,$maxSize){ 
  3.  
  4. $filename=$fileInfo["name"]; 
  5. $tmp_name=$fileInfo["tmp_name"]; 
  6. $size=$fileInfo["size"]; 
  7. $error=$fileInfo["error"]; 
  8. $type=$fileInfo["type"]; 
  9.  
  10. //服务器端设定限制 
  11.  
  12. $ext=pathinfo($filename,PATHINFO_EXTENSION); 
  13.  
  14. //目的信息 
  15. if (!file_exists($path)) {   
  16.   mkdir($path,0777,true); 
  17.   chmod($path, 0777); 
  18. $uniName=md5(uniqid(microtime(true),true)).'.'.$ext
  19. $destination=$path."/".$uniName
  20. if ($error==0) { 
  21.   if ($size>$maxSize) { 
  22.     exit("上传文件过大!"); 
  23.   } 
  24.   if (!in_array($ext$allowExt)) { 
  25.     exit("非法文件类型"); 
  26.   } 
  27.   if (!is_uploaded_file($tmp_name)) { 
  28.     exit("上传方式有误,请使用post方式"); 
  29.   } 
  30.   //判断是否为真实图片(防止伪装成图片的病毒一类的 
  31.   if (!getimagesize($tmp_name)) {//getimagesize真实返回数组,否则返回false 
  32.     exit("不是真正的图片类型"); 
  33.   } 
  34.   if (@move_uploaded_file($tmp_name$destination)) {//@错误抑制符,不让用户看到警告 
  35.     echo "文件".$filename."上传成功!"
  36.   }else
  37.     echo "文件".$filename."上传失败!"
  38.   } 
  39. }else
  40.   switch ($error){ 
  41.     case 1: 
  42.       echo "超过了上传文件的最大值,请上传2M以下文件"
  43.       break
  44.     case 2: 
  45.       echo "上传文件过多,请一次上传20个及以下文件!"
  46.       break
  47.     case 3: 
  48.       echo "文件并未完全上传,请再次尝试!"
  49.       break
  50.     case 4: 
  51.       echo "未选择上传文件!"
  52.       break
  53.     case 7: 
  54.       echo "没有临时文件夹"
  55.       break
  56.   } 
  57. return $destination

调用:

  1. <?php 
  2. header('content-type:text/html;charset=utf-8'); 
  3. $fileInfo=$_FILES["myFile"]; 
  4. $maxSize=10485760;//10M,10*1024*1024 
  5. $allowExt=array('jpeg','jpg','png','tif'); 
  6. $path="uploads"
  7. include_once 'upFunc.php'
  8. uploadFile($fileInfo$path$allowExt$maxSize); 

三、多文件的上传实现

3.1 利用单文件封装

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"
  2. <html> 
  3. <head> 
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
  5. <title>Insert title here</title> 
  6. </head> 
  7. <body> 
  8. <form action="doAction5.php" method="post" enctype="multipart/form-data"
  9. 请选择您要上传的文件:<input type="file" name="myFile1" /><br/> 
  10. 请选择您要上传的文件:<input type="file" name="myFile2" /><br/> 
  11. 请选择您要上传的文件:<input type="file" name="myFile3" /><br/> 
  12. 请选择您要上传的文件:<input type="file" name="myFile4" /><br/> 
  13. <input type="submit" value="上传"/> 
  14. </form> 
  15. </body> 
  16. </html> 
  17.  
  18. <?php 
  19. //print_r($_FILES); 
  20. header('content-type:text/html;charset=utf-8'); 
  21. include_once 'upFunc.php'
  22. foreach ($_FILES as $fileInfo){ 
  23.   $file[]=uploadFile($fileInfo); 

这里的思路,从print_r($_FILES)中去找,打印出来看到是个二维数组,很简单,遍历去用就好了!

上面那个function的定义改一下,给定一些默认值

  1. function uploadFile($fileInfo,$path="uploads",$allowExt=array('jpeg','jpg','png','tif'),$maxSize=10485760){ 

这样子,简单是简单,但遇到一些问题。

正常的上传4个图片是没问题,但要是中间激活了函数中的exit,就会立即停止,导致其他图片也无法上传。

3.2 升级版封装

旨在实现针对多个或单个文件上传的封装

首先这样子写个静态文件

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
  2. <html> 
  3. <head> 
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
  5. <title>Insert title here</title> 
  6. </head> 
  7. <body> 
  8. <form action="doAction5.php" method="post" enctype="multipart/form-data"> 
  9. 请选择您要上传的文件:<input type="file" name="myFile[]" /><br/> 
  10. 请选择您要上传的文件:<input type="file" name="myFile[]" /><br/> 
  11. 请选择您要上传的文件:<input type="file" name="myFile[]" /><br/> 
  12. 请选择您要上传的文件:<input type="file" name="myFile[]" /><br/> 
  13. <input type="submit" value="上传"/> 
  14. </form> 
  15. </body> 
  16. </html> 

打印一下$_FILES

  1. Array 
  2.   [myFile] => Array 
  3.     ( 
  4.       [name] => Array 
  5.         ( 
  6.           [0] => test32.png 
  7.           [1] => test32.png 
  8.           [2] => 333.png 
  9.           [3] => test41.png 
  10.         ) 
  11.  
  12.       [type] => Array 
  13.         ( 
  14.           [0] => image/png 
  15.           [1] => image/png 
  16.           [2] => image/png 
  17.           [3] => image/png 
  18.         ) 
  19.  
  20.       [tmp_name] => Array 
  21.         ( 
  22.           [0] => D:\wamp\tmp\php831C.tmp 
  23.           [1] => D:\wamp\tmp\php834C.tmp 
  24.           [2] => D:\wamp\tmp\php837C.tmp 
  25.           [3] => D:\wamp\tmp\php83BB.tmp 
  26.         ) 
  27.  
  28.       [error] => Array 
  29.         ( 
  30.           [0] => 0 
  31.           [1] => 0 
  32.           [2] => 0 
  33.           [3] => 0 
  34.         ) 
  35.  
  36.       [size] => Array 
  37.         ( 
  38.           [0] => 46174 
  39.           [1] => 46174 
  40.           [2] => 34196 
  41.           [3] => 38514 
  42.         ) 
  43.  
  44.     ) 
  45.  

可以得到一个三维数组。

复杂是复杂了,但复杂的有规律,各项数值都在一起了,很方便我们取值!!

所以先得到文件信息,变成单文件处理那种信息

  1. function getFiles(){ 
  2.   $i=0; 
  3.   foreach($_FILES as $file){ 
  4.     if(is_string($file['name'])){ //单文件判定 
  5.       $files[$i]=$file
  6.       $i++; 
  7.     }elseif(is_array($file['name'])){ 
  8.       foreach($file['name'as $key=>$val){ //我的天,这个$key用的diao 
  9.         $files[$i]['name']=$file['name'][$key]; 
  10.         $files[$i]['type']=$file['type'][$key]; 
  11.         $files[$i]['tmp_name']=$file['tmp_name'][$key]; 
  12.         $files[$i]['error']=$file['error'][$key]; 
  13.         $files[$i]['size']=$file['size'][$key]; 
  14.         $i++; 
  15.       } 
  16.     } 
  17.   } 
  18.   return $files
  19.     

然后之前的那种exit错误,就把exit改一下就好了,这里用res

  1. function uploadFile($fileInfo,$path='./uploads',$flag=true,$maxSize=1048576,$allowExt=array('jpeg','jpg','png','gif')){ 
  2.   //$flag=true; 
  3.   //$allowExt=array('jpeg','jpg','gif','png'); 
  4.   //$maxSize=1048576;//1M 
  5.   //判断错误号 
  6.   $res=array(); 
  7.   if($fileInfo['error']===UPLOAD_ERR_OK){ 
  8.     //检测上传得到小 
  9.     if($fileInfo['size']>$maxSize){ 
  10.       $res['mes']=$fileInfo['name'].'上传文件过大'
  11.     } 
  12.     $ext=getExt($fileInfo['name']); 
  13.     //检测上传文件的文件类型 
  14.     if(!in_array($ext,$allowExt)){ 
  15.       $res['mes']=$fileInfo['name'].'非法文件类型'
  16.     } 
  17.     //检测是否是真实的图片类型 
  18.     if($flag){ 
  19.       if(!getimagesize($fileInfo['tmp_name'])){ 
  20.         $res['mes']=$fileInfo['name'].'不是真实图片类型'
  21.       } 
  22.     } 
  23.     //检测文件是否是通过HTTP POST上传上来的 
  24.     if(!is_uploaded_file($fileInfo['tmp_name'])){ 
  25.       $res['mes']=$fileInfo['name'].'文件不是通过HTTP POST方式上传上来的'
  26.     } 
  27.     if($resreturn $res
  28.     //$path='./uploads'; 
  29.     if(!file_exists($path)){ 
  30.       mkdir($path,0777,true); 
  31.       chmod($path,0777); 
  32.     } 
  33.     $uniName=getUniName(); 
  34.     $destination=$path.'/'.$uniName.'.'.$ext
  35.     if(!move_uploaded_file($fileInfo['tmp_name'],$destination)){ 
  36.       $res['mes']=$fileInfo['name'].'文件移动失败'
  37.     } 
  38.     $res['mes']=$fileInfo['name'].'上传成功'
  39.     $res['dest']=$destination
  40.     return $res
  41.       
  42.   }else
  43.     //匹配错误信息 
  44.     switch ($fileInfo ['error']) { 
  45.       case 1 : 
  46.         $res['mes'] = '上传文件超过了PHP配置文件中upload_max_filesize选项的值'
  47.         break
  48.       case 2 : 
  49.         $res['mes'] = '超过了表单MAX_FILE_SIZE限制的大小'
  50.         break
  51.       case 3 : 
  52.         $res['mes'] = '文件部分被上传'
  53.         break
  54.       case 4 : 
  55.         $res['mes'] = '没有选择上传文件'
  56.         break
  57.       case 6 : 
  58.         $res['mes'] = '没有找到临时目录'
  59.         break
  60.       case 7 : 
  61.       case 8 : 
  62.         $res['mes'] = '系统错误'
  63.         break
  64.     } 
  65.     return $res
  66.   } 

里面封装了两个小的

  1. function getExt($filename){ 
  2.   return strtolower(pathinfo($filename,PATHINFO_EXTENSION)); 
  3.  
  4. /** 
  5.  * 产生唯一字符串 
  6.  * @return string 
  7.  */ 
  8. function getUniName(){ 
  9.   return md5(uniqid(microtime(true),true)); 

然后静态中,用multiple属性实现多个文件的输入;

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
  2. <html> 
  3. <head> 
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
  5. <title>Insert title here</title> 
  6. </head> 
  7. <body> 
  8. <form action="doAction6.php" method="POST" enctype="multipart/form-data"> 
  9. 请选择您要上传的文件:<input type="file" name="myFile[]" multiple='multiple' /><br/> 
  10. <input type="submit" value="上传"/> 
  11. </form> 
  12. </body> 
  13. </html> 

doAction6

  1. <?php  
  2. //print_r($_FILES); 
  3. header("content-type:text/html;charset=utf-8"); 
  4. require_once 'upFunc2.php'
  5. require_once 'common.func.php'
  6. $files=getFiles(); 
  7. // print_r($files); 
  8. foreach($files as $fileInfo){ 
  9.   $res=uploadFile($fileInfo); 
  10.   echo $res['mes'],'<br/>'
  11.   $uploadFiles[]=@$res['dest']; 
  12. $uploadFiles=array_values(array_filter($uploadFiles)); 
  13. //print_r($uploadFiles); 

这样子的几个文件,就实现比较强大的面向过程的上传文件的功能(学的叫一个心酸。。。);

四、面向对象的文件上传

(不是很写的动了。。。先粘过来,再说吧。。。

  1. <?php  
  2. class upload{ 
  3.   protected $fileName
  4.   protected $maxSize
  5.   protected $allowMime
  6.   protected $allowExt
  7.   protected $uploadPath
  8.   protected $imgFlag
  9.   protected $fileInfo
  10.   protected $error
  11.   protected $ext
  12.   /** 
  13.    * @param string $fileName 
  14.    * @param string $uploadPath 
  15.    * @param string $imgFlag 
  16.    * @param number $maxSize 
  17.    * @param array $allowExt 
  18.    * @param array $allowMime 
  19.    */ 
  20.   public function __construct($fileName='myFile',$uploadPath='./uploads',$imgFlag=true,$maxSize=5242880,$allowExt=array('jpeg','jpg','png','gif'),$allowMime=array('image/jpeg','image/png','image/gif')){ 
  21.     $this->fileName=$fileName
  22.     $this->maxSize=$maxSize
  23.     $this->allowMime=$allowMime
  24.     $this->allowExt=$allowExt
  25.     $this->uploadPath=$uploadPath
  26.     $this->imgFlag=$imgFlag
  27.     $this->fileInfo=$_FILES[$this->fileName]; 
  28.   } 
  29.   /** 
  30.    * 检测上传文件是否出错 
  31.    * @return boolean 
  32.    */ 
  33.   protected function checkError(){ 
  34.     if(!is_null($this->fileInfo)){ 
  35.       if($this->fileInfo['error']>0){ 
  36.         switch($this->fileInfo['error']){ 
  37.           case 1: 
  38.             $this->error='超过了PHP配置文件中upload_max_filesize选项的值'
  39.             break
  40.           case 2: 
  41.             $this->error='超过了表单中MAX_FILE_SIZE设置的值'
  42.             break
  43.           case 3: 
  44.             $this->error='文件部分被上传'
  45.             break
  46.           case 4: 
  47.             $this->error='没有选择上传文件'
  48.             break
  49.           case 6: 
  50.             $this->error='没有找到临时目录'
  51.             break
  52.           case 7: 
  53.             $this->error='文件不可写'
  54.             break
  55.           case 8: 
  56.             $this->error='由于PHP的扩展程序中断文件上传'
  57.             break
  58.               
  59.         } 
  60.         return false; 
  61.       }else
  62.         return true; 
  63.       } 
  64.     }else
  65.       $this->error='文件上传出错'
  66.       return false; 
  67.     } 
  68.   } 
  69.   /** 
  70.    * 检测上传文件的大小 
  71.    * @return boolean 
  72.    */ 
  73.   protected function checkSize(){ 
  74.     if($this->fileInfo['size']>$this->maxSize){ 
  75.       $this->error='上传文件过大'
  76.       return false; 
  77.     } 
  78.     return true; 
  79.   } 
  80.   /** 
  81.    * 检测扩展名 
  82.    * @return boolean 
  83.    */ 
  84.   protected function checkExt(){ 
  85.     $this->ext=strtolower(pathinfo($this->fileInfo['name'],PATHINFO_EXTENSION)); 
  86.     if(!in_array($this->ext,$this->allowExt)){ 
  87.       $this->error='不允许的扩展名'
  88.       return false; 
  89.     } 
  90.     return true; 
  91.   } 
  92.   /** 
  93.    * 检测文件的类型 
  94.    * @return boolean 
  95.    */ 
  96.   protected function checkMime(){ 
  97.     if(!in_array($this->fileInfo['type'],$this->allowMime)){ 
  98.       $this->error='不允许的文件类型'
  99.       return false; 
  100.     } 
  101.     return true; 
  102.   } 
  103.   /** 
  104.    * 检测是否是真实图片 
  105.    * @return boolean 
  106.    */ 
  107.   protected function checkTrueImg(){ 
  108.     if($this->imgFlag){ 
  109.       if(!@getimagesize($this->fileInfo['tmp_name'])){ 
  110.         $this->error='不是真实图片'
  111.         return false; 
  112.       } 
  113.       return true; 
  114.     } 
  115.   } 
  116.   /** 
  117.    * 检测是否通过HTTP POST方式上传上来的 
  118.    * @return boolean 
  119.    */ 
  120.   protected function checkHTTPPost(){ 
  121.     if(!is_uploaded_file($this->fileInfo['tmp_name'])){ 
  122.       $this->error='文件不是通过HTTP POST方式上传上来的'
  123.       return false; 
  124.     } 
  125.     return true; 
  126.   } 
  127.   /** 
  128.    *显示错误  
  129.    */ 
  130.   protected function showError(){ 
  131.     exit('<span style="color:red">'.$this->error.'</span>'); 
  132.   } 
  133.   /** 
  134.    * 检测目录不存在则创建 
  135.    */ 
  136.   protected function checkUploadPath(){ 
  137.     if(!file_exists($this->uploadPath)){ 
  138.       mkdir($this->uploadPath,0777,true); 
  139.     } 
  140.   } 
  141.   /** 
  142.    * 产生唯一字符串 
  143.    * @return string 
  144.    */ 
  145.   protected function getUniName(){ 
  146.     return md5(uniqid(microtime(true),true)); 
  147.   } 
  148.   /** 
  149.    * 上传文件 
  150.    * @return string 
  151.    */ 
  152.   public function uploadFile(){ 
  153.     if($this->checkError()&&$this->checkSize()&&$this->checkExt()&&$this->checkMime()&&$this->checkTrueImg()&&$this->checkHTTPPost()){ 
  154.       $this->checkUploadPath(); 
  155.       $this->uniName=$this->getUniName(); 
  156.       $this->destination=$this->uploadPath.'/'.$this->uniName.'.'.$this->ext; 
  157.       if(@move_uploaded_file($this->fileInfo['tmp_name'], $this->destination)){ 
  158.         return $this->destination; 
  159.       }else
  160.         $this->error='文件移动失败'
  161.         $this->showError(); 
  162.       } 
  163.     }else
  164.       $this->showError(); 
  165.     } 
  166.   } 
  167.  
  168. <?php  
  169. header('content-type:text/html;charset=utf-8'); 
  170. require_once 'upload.class.php'
  171. $upload=new upload('myFile1','imooc'); 
  172. $dest=$upload->uploadFile(); 
  173. echo $dest

四、下载

对于浏览器不识别的,可以直接下载,但对于能识别的,需要多一两步

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
  2. <html xmlns="http://www.w3.org/1999/xhtml"
  3. <head> 
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
  5. <title>Insert title here</title> 
  6. </head> 
  7. <body> 
  8. <a href="1.rar">下载1.rar</a> 
  9. <br /> 
  10. <a href="1.jpg">下载1.jpg</a> 
  11. <br /> 
  12. <a href="doDownload.php?filename=1.jpg">通过程序下载1.jpg</a> 
  13. <br /> 
  14. <a href="doDownload.php?filename=../upload/nv.jpg">下载nv.jpg</a> 
  15. <?php 
  16.  
  17. ?> 
  18. </body> 
  19. </html> 
  20.  
  21. <?php  
  22. $filename=$_GET['filename']; 
  23. header('content-disposition:attachment;filename='.basename($filename)); 
  24. header('content-length:'.filesize($filename)); 
  25. readfile($filename); 
  26. ------------------总结----------------------- 
  27.  
  28. <form action="doAction.php" method="post" enctype="multipart/form-data"
  29.  <input type="file" name="myFile" /><br/> 

二维数组的降维处理;

$_FILES变量

move_upload_file();copy();

tmp_name临时文件;

拓展名的提取;

真实图片的验证;

唯一文件名的生成;

函数封装以及调用;

利用单个文件函数实现多文件上传;

小功能的封装;

多文件的遍历;

面向对象的开发过程;

Tags: PHP文件上传 PHP文件下载

分享到: