一、文件上传的原理:
1、文件上传原理:将客户端的文件上传到服务器,再将服务器的临时文件上传到指定目录。
2、客户端配置:前端表单页面,提交表单的发送方式为post,添加enctype="multipart/form-data",且表单发送前的编码方式必须是二进制编码。当前端页面提交后,后端需要处理的,首先获得文件的后缀名,并对文件的存放位置进行设定。
3、服务器端配置:
file_uploads = On,支持HTTP上传uoload_tmp_dir = ,临时文件保存目录upload_max_filesize = 2M,允许上传文件的最大值max_file_uploads = 20 ,允许一次上传到的最大文件数post_max_size = 8M,post方式发送数据的最大值max_execution_time = -1,设置了脚本被解析器终止之前允许的最大执行时间,单位为秒,防止程序写的不好而占尽服务器资源。-1代表无穷max_input_time = 60 ,脚本解析输入数据允许的最大时间,单位为秒max_input_nesting_level = 64 ,设置输入变量的嵌套深度max_input_vars_ = 1000,接受多少输入的变量(限制分别应用于$_GET、$_POST和$_COOKIE超全局变量,将会导致E_WARNING的产生,更多的输入变量将会从请求中截断。memory_limit = 128M,最大单线程的独立内存使用量。也就是一个web请求,给予线程最大的内存使用量的定义。
二、文件上传实例:
1-单文件上传:
<!-- 单个文件上传--> <form action="uploadFile.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="500000"> <input type="file" name="myFile" /><input type="submit" value="上传文件"/> </form>
2-多文件上传:
<form action="uploadFile.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="3000000"> <input type="file" name="myFile[]" /><br/> <input type="file" name="myFile[]" /><br/> <input type="submit" value="上传文件"/> </form>
3-多文件批量上传:
<!-- 多文件(批量)上传--> <form action="uploadFile.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="3000000"> <input type="file" name="myFile[]" multiple="multiple"/><br/> <input type="submit" value="上传文件"/> </form>
4-upload.php文件
<?php header('Content-Type:text/html;charset=utf-8'); //创建上传文件信息 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; } //针对于单文件、多个单文件、多文件的上传 //默认上传保存的文件夹为本地的'uploadimg'文件夹,允许上传文件的大小最大为2M function uploadFile($fileInfo,$path='./uploadimg',$flag=true,$allowExt=array('jpeg','jpg','png','gif'),$maxSize=2097152){ //判断错误号 if($fileInfo['error']===UPLOAD_ERR_OK){ //检测上传文件的大小 if($fileInfo['size']>$maxSize){ $res['wenjian']=$fileInfo['name'].'上传文件过大'; } $ext=getExt($fileInfo['name']); //检测上传文件的文件类型 if(!in_array($ext,$allowExt)){ $res['wenjian']=$fileInfo['name'].'非法文件类型'; } //检测是否是真实的图片类型 if($flag){ if(!getimagesize($fileInfo['tmp_name'])){ $res['wenjian']=$fileInfo['name'].'不是真实图片类型'; } } //检测文件是否是通过HTTP POST上传上来的 if(!is_uploaded_file($fileInfo['tmp_name'])){ $res['wenjian']=$fileInfo['name'].'文件不是通过HTTP POST方式上传上来的'; } if( $res ) return $res; //$path='./uploadimg'; //如果没有这个文件夹,就创建 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['wenjian']=$fileInfo['name'].'文件上传失败'; } $res['wenjian']=$fileInfo['name'].'上传成功'; $res['dest']=$destination; return $res; }else{ //匹配错误信息 switch($fileInfo['error']){ case 1: $res['wenjian'] = '上传文件超过了PHP配置文件中upload_max_filesize选项的值'; break; case 2: $res['wenjian'] = '超过了HTML表单MAX_FILE_SIZE限制的大小'; break; case 3: $res['wenjian'] = '文件部分被上传'; break; case 4: $res['wenjian'] = '没有选择上传文件'; break; case 6: $res['wenjian'] = '没有找到临时目录'; break; case 7: $res['wenjian'] = '文件写入失败'; break; case 8: $res['wenjian'] = '上传的文件被PHP扩展程序中断'; break; } return $res; } } //得到文件扩展名 function getExt($filename){ return strtolower(pathinfo($filename,PATHINFO_EXTENSION)); } //产生唯一字符串 function getUniName(){ return md5(uniqid(microtime(true),true)); } ?>
5-uploadFile.php文件
<?php header("content-type:text/html;charset=utf-8"); require_once 'upload.php'; $files=getFiles(); //修改上传目录,如没这个文件夹,就创建一个 $filepath='uploadimg'; //修改检查上传的文件是否为真实的图片。true:检查;'false':不要检查上传的文件是否为真实的图片 //修改允许上传文件的类型,为('jpeg','jpg','png','gif','html','txt') $allowExt=array('jpeg','jpg','png','gif','html','txt'); //上传大小限制 $maxSize=2097152; foreach($files as $fileInfo){ $res=uploadFile($fileInfo,$filepath,$flag,$allowExt,$maxSize); echo $res['wenjian'],'<br/>'; $uploadFiles[]=$res['dest']; } $uploadFiles=array_values(array_filter($uploadFiles)); print_r($uploadFiles);//打印查看上传保存的结果 ?>
三、总结:通过老师的源码和部分同学写的案例,了解了文件上传的大概流程和步骤,还没达到自己能敲出所有代码的阶段。做为小白,先从仿开始,做比不做强一点吧,更需要加倍努力学习。