文件的上传下载
在B/S程序中文件上传已经成为一个常用功能。其目的是客户可以通过浏览器(Browser)将文件上传到服务器(Server)上的指定目录。
客户端浏览器通过上传form表单向服务器上传文件
代码:
1 <html> 2 <head><title>文件上传</title></head> 3 <body> 4 <form action="upload.php" method="post" enctype="multipart/form-data"> 5 <input type="hidden" name="MAX_FILE_SIZE" value="1000000"> 6 选择文件:<input type="file" name="myfile"> 7 <input type="submit" value="上传文件"> 8 </form> 9 </body> 10 </html>
注意:
POST提交方法:表单提交只有GET和POST两种,而GET传递数据量小,只能(必须)选择POST
enctype="multipart/form-data"通过这个属性浏览器告诉服务器将要上传文件,这样务器可以知道上载的文件带有常规的表单信息。
隐藏表单MAX_FILE_SIZE此字段必须在文件输入字段之前,控制最大的传递文件的大小(字节)。客户端配置,可被跳过,防君子不防小人)
多文件上传:<input type="file" name="myfile[]"/>可以添加属性multiple使得可以选择多个文件
服务器端通过PHP管理文件上传
需要以下三个方面的信息:
1.设置PHP配置文件中的指令:用于精细的调节PHP的文件上传功能。
php.ini的配置信息
file_uploads = On /Off 是否允许文件上传
upload_max_filesize=2M 上传的文件的最大大小
post_max_size = 8M POST数据所允许的最大大小
upload_tmp_dir 上传文件放置的临时目录
注意配置:upload_max_filesize的大小一定要小于post_max_size的配置大小。
2.$_FILES多维数组:用于存储各种与上传文件有关的信息,其他数据还使用$_POST去接收
$_FILES["myfile"]["name"] 客户端机器文件的原始名称,包含扩展名
$_FILES["myfile"]["size"] 已上传文件的大小,单位字节
$_FILES["myfile"]["tmp_name"] 文件被上传后再服务器端存储的临时文件名(这是存储在临时目录【由PHP指令upload_tmp_dir指定】中时所指定非文件名)
注意:脚本结束后自动删除
$_FILES["myfile"]["error"] 伴随文件上传时产生的错误信息
error:上传的错误号:0--4
0:表示没有发生任何错误。
1:上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
2:表示上传文件大小超出了HTML表单隐藏域属性的MAX_FILE_SIZE元素所指定的最大值。
3:表示文件只被部分上传。
4:表示没有上传任何文件。
6:找不到临时文件夹
7:文件写入失败
$_FILES["myfile"]["type"] 获取从客户端上传文件的MIME类型
3.PHP文件上传处理函数:用于上传文件的后续处理。
函数is_uploaded_file()判断指定的文件是否通过HTTP POST上传,如果是返回true
bool is_uploaded_file(string filename)
唯一的参数必须指定类似与$_FILES["myfile"]["tmp_name"]的变量,而不能是客户端上传的文件名$_FILES["myfile"]["name"]
函数move_uploaded_file()文件上传后会先存入临时目录中,需要使用此函数将上传文件移动到指定位置
bool move_uploaded_file(string filename,string destination)
虽然copy和move一样可以做到这个功能但是函数move_uploaded_file()还提供一个功能,即检查并确保第一个参数filename指定的文件是否是合法上传文件。合法则移动,不合法则不执行任何操作返回false,发出一条警告。移动成功返回true。
处理多文件上传:
上传一个文件时全局数组$_FILES为一个二维数组,当使用多文件上传全局数组$_FILES已经变成一个三维数组,这样就可以存储多个上传文件的信息。
文件的下载
1.获取要下载的图片名(加上路径)
$file="./uploads/".$_GET[‘name‘];
2.重设响应类型
$info=getimagesize[‘mime‘];
header("content-type:".$info);改变响应类型
3.指定下载的文件名
header("content-disposition:attachment;filename=".$GET["name"]);
4.指定文件的大小
header("content-length:".filesize($file));
5.响应内容
readfile($file);
1 <?php 2 //文件上传函数 3 function upload($path,$upfile,$typeList=array(),$maxSize=0){ 4 //定义返回信息数组 5 $res = array( 6 "info"=>"", 7 "error"=>false 8 ); 9 10 //格式化文件上传路径 11 $path=rtrim($path,"/")."/"; 12 13 if($upfile[‘error‘]>0){ 14 switch($upfile[‘error‘]){ 15 case 1: 16 $info="上传文件的大小超出了约定值!"; 17 break; 18 case 2: 19 $info="上传文件大小超出了HTML表单隐藏域属性的MAX_FILE_SIZE元素所指定的最大值。"; 20 break; 21 case 3: 22 $info="文件只被部分上传!"; 23 break; 24 case 4: 25 $info="没有上传任何文件。"; 26 break; 27 case 6: 28 $info="找不到临时文件夹。"; 29 break; 30 case 7: 31 $info="文件写入失败。"; 32 break; 33 } 34 $res[‘info‘]="上传失败!原因:".$info; 35 return $res; 36 } 37 38 //判断文件上传类型是否合法 39 if(@$typeList && count(@$typeList)>0){ 40 41 if(!in_array($upfile[‘type‘],$typeList)){ 42 $info="不被允许的上传文件类型!"; 43 $res[‘info‘]="上传失败!原因:".$info; 44 return $res; 45 } 46 }else{ 47 $info="上传失败!原因:服务器没有设定允许上传的文件类型!"; 48 $res[‘info‘]="上传失败!原因:".$info; 49 return $res; 50 } 51 52 //判断上传文件大小是否合法 53 if($maxSize>0&&$upfile[‘size‘]>$maxsize){ 54 $info="上传文件大小越界!"; 55 $res[‘info‘]="上传失败!原因:".$info; 56 return $res; 57 } 58 59 //随机一个文件名 60 $pathinfo=pathinfo($upfile[‘name‘]); 61 @$ext=$pathinfo[‘extension‘]; 62 63 do{ 64 $newname=date("YmdHis",time()).rand(1000,9999).".".$ext; 65 }while(file_exists($path.$newname)); 66 67 //执行上传文件的移动 68 if(is_uploaded_file($upfile[‘tmp_name‘])){ 69 if(move_uploaded_file($upfile[‘tmp_name‘],$path.$newname)){ 70 $info="恭喜,上传成功!文件名:".$newname; 71 $res[‘info‘]=$info; 72 $res[‘error‘]=true; 73 return $res; 74 }else{ 75 $info="移动上传文件失败!"; 76 $res[‘info‘]="上传失败!原因:".$info; 77 return $res; 78 } 79 }else{ 80 $info="不是有效的上传文件!"; 81 $res[‘info‘]="上传失败!原因:".$info; 82 return $res; 83 } 84 } 85 ?>