php实现文件下载和多文件上传

来源:互联网 发布:js动态为div添加style 编辑:程序博客网 时间:2024/05/17 00:58

文件下载:

html:

<html><body>    <a href="1.rar">下载1.rar</a>    <br />    <a href="1.jpg">下载1.jpg</a> <!--会显示文件内容,而不是下载-->    <br />    <a href="doDownload.php?filename=1.jpg">通过程序下载1.jpg</a>    <br />    <a href="doDownload.php?filename=../upload/nv.jpg">下载nv.jpg</a></body></html>

php处理:

<?php $filename=$_GET['filename'];//设置下载文件名header('content-disposition:attachment;filename='.basename($filename));header('content-length:'.filesize($filename));readfile($filename);

文件上传:

html代码:

<html><body>    <form action="doAction5.php" method="post" enctype="multipart/form-data">        请选择您要上传的文件:<input type="file" name='myFile1' /><br/>        请选择您要上传的文件:<input type="file" name='myFile2' /><br/>        请选择您要上传的文件:<input type="file" name='myFile[]' /><br/>        请选择您要上传的文件:<input type="file" name='myFile[]' /><br/>        请选择您要上传的文件:<input type="file" name='myFile[]' multiple="multiple" /><br/>        <input type="submit" value="上传文件" />    </form></body></html>

php代码:

common.func.php

<?php /** * 得到文件扩展名 * @param string $filename * @return string */function getExt($filename){return strtolower(pathinfo($filename,PATHINFO_EXTENSION));}/** * 产生唯一字符串 * @return string */function getUniName(){return md5(uniqid(microtime(true),true));}

upload.func1.php

<?php /** * 构建上传文件信息 * @return unknown */function getFiles(){$i=0;foreach($_FILES as $file){if(is_string($file['name'])){$files[$i]=$file;$i++;}elseif(is_array($file['name'])){foreach($file['name'] as $key=>$val){$files[$i]['name']=$file['name'][$key];$files[$i]['type']=$file['type'][$key];$files[$i]['tmp_name']=$file['tmp_name'][$key];$files[$i]['error']=$file['error'][$key];$files[$i]['size']=$file['size'][$key];$i++;}}}return $files;}/** * 针对于单文件、多个单文件、多文件的上传 * @param array $fileInfo * @param string $path * @param string $flag * @param number $maxSize * @param array $allowExt * @return string */function uploadFile($fileInfo,$path='./uploads',$flag=true,$maxSize=1048576,$allowExt=array('jpeg','jpg','png','gif')){//$flag=true;//$allowExt=array('jpeg','jpg','gif','png');//$maxSize=1048576;//1M//判断错误号if($fileInfo['error']===UPLOAD_ERR_OK){//检测上传得到小if($fileInfo['size']>$maxSize){$res['mes']=$fileInfo['name'].'上传文件过大';}$ext=getExt($fileInfo['name']);//检测上传文件的文件类型if(!in_array($ext,$allowExt)){$res['mes']=$fileInfo['name'].'非法文件类型';}//检测是否是真实的图片类型if($flag){if(!getimagesize($fileInfo['tmp_name'])){$res['mes']=$fileInfo['name'].'不是真实图片类型';}}//检测文件是否是通过HTTP POST上传上来的if(!is_uploaded_file($fileInfo['tmp_name'])){$res['mes']=$fileInfo['name'].'文件不是通过HTTP POST方式上传上来的';}if($res) return $res;//$path='./uploads';if(!file_exists($path)){mkdir($path,0777,true);chmod($path,0777);}$uniName=getUniName();$destination=$path.'/'.$uniName.'.'.$ext;if(!move_uploaded_file($fileInfo['tmp_name'],$destination)){$res['mes']=$fileInfo['name'].'文件移动失败';}$res['mes']=$fileInfo['name'].'上传成功';$res['dest']=$destination;return $res;}else{//匹配错误信息switch ($fileInfo ['error']) {case 1 :$res['mes'] = '上传文件超过了PHP配置文件中upload_max_filesize选项的值';break;case 2 :$res['mes'] = '超过了表单MAX_FILE_SIZE限制的大小';break;case 3 :$res['mes'] = '文件部分被上传';break;case 4 :$res['mes'] = '没有选择上传文件';break;case 6 :$res['mes'] = '没有找到临时目录';break;case 7 :case 8 :$res['mes'] = '系统错误';break;}return $res;}}

doAction5.php

<?php //print_r($_FILES);header("content-type:text/html;charset=utf-8");require_once 'upload.func1.php';require_once 'common.func.php';$files=getFiles();// print_r($files);foreach($files as $fileInfo){$res=uploadFile($fileInfo);echo $res['mes'],'<br/>';$uploadFiles[]=$res['dest'];}$uploadFiles=array_values(array_filter($uploadFiles));print_r($uploadFiles);

上面是通过函数实现,下载封装成为类:

html:

<html xmlns="http://www.w3.org/1999/xhtml"><body><form action="doAction6.php" method="post" enctype="multipart/form-data">    请选择您要上传的文件:<input type="file" name='myFile1' />    <input type="submit" value="上传文件" /></form></body></html>

upload.class.php

<?php class upload{protected $fileName;protected $maxSize;protected $allowMime;protected $allowExt;protected $uploadPath;protected $imgFlag;protected $fileInfo;protected $error;protected $ext;/** * @param string $fileName * @param string $uploadPath * @param string $imgFlag * @param number $maxSize * @param array $allowExt * @param array $allowMime */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')){$this->fileName=$fileName;$this->maxSize=$maxSize;$this->allowMime=$allowMime;$this->allowExt=$allowExt;$this->uploadPath=$uploadPath;$this->imgFlag=$imgFlag;$this->fileInfo=$_FILES[$this->fileName];}/** * 检测上传文件是否出错 * @return boolean */protected function checkError(){if(!is_null($this->fileInfo)){if($this->fileInfo['error']>0){switch($this->fileInfo['error']){case 1:$this->error='超过了PHP配置文件中upload_max_filesize选项的值';break;case 2:$this->error='超过了表单中MAX_FILE_SIZE设置的值';break;case 3:$this->error='文件部分被上传';break;case 4:$this->error='没有选择上传文件';break;case 6:$this->error='没有找到临时目录';break;case 7:$this->error='文件不可写';break;case 8:$this->error='由于PHP的扩展程序中断文件上传';break;}return false;}else{return true;}}else{$this->error='文件上传出错';return false;}}/** * 检测上传文件的大小 * @return boolean */protected function checkSize(){if($this->fileInfo['size']>$this->maxSize){$this->error='上传文件过大';return false;}return true;}/** * 检测扩展名 * @return boolean */protected function checkExt(){$this->ext=strtolower(pathinfo($this->fileInfo['name'],PATHINFO_EXTENSION));if(!in_array($this->ext,$this->allowExt)){$this->error='不允许的扩展名';return false;}return true;}/** * 检测文件的类型 * @return boolean */protected function checkMime(){if(!in_array($this->fileInfo['type'],$this->allowMime)){$this->error='不允许的文件类型';return false;}return true;}/** * 检测是否是真实图片 * @return boolean */protected function checkTrueImg(){if($this->imgFlag){if(!@getimagesize($this->fileInfo['tmp_name'])){$this->error='不是真实图片';return false;}return true;}}/** * 检测是否通过HTTP POST方式上传上来的 * @return boolean */protected function checkHTTPPost(){if(!is_uploaded_file($this->fileInfo['tmp_name'])){$this->error='文件不是通过HTTP POST方式上传上来的';return false;}return true;}/** *显示错误  */protected function showError(){exit('<span style="color:red">'.$this->error.'</span>');}/** * 检测目录不存在则创建 */protected function checkUploadPath(){if(!file_exists($this->uploadPath)){mkdir($this->uploadPath,0777,true);}}/** * 产生唯一字符串 * @return string */protected function getUniName(){return md5(uniqid(microtime(true),true));}/** * 上传文件 * @return string */public function uploadFile(){if($this->checkError()&&$this->checkSize()&&$this->checkExt()&&$this->checkMime()&&$this->checkTrueImg()&&$this->checkHTTPPost()){$this->checkUploadPath();$this->uniName=$this->getUniName();$this->destination=$this->uploadPath.'/'.$this->uniName.'.'.$this->ext;if(@move_uploaded_file($this->fileInfo['tmp_name'], $this->destination)){return  $this->destination;}else{$this->error='文件移动失败';$this->showError();}}else{$this->showError();}}}

doAction6.php

<?php header('content-type:text/html;charset=utf-8');require_once 'upload.class.php';$upload=new upload('myFile1','imooc');$dest=$upload->uploadFile();echo $dest;


0 0
原创粉丝点击