一、上传文件和获取
①type属性为file的input元素可以通过表单提交文件(上传文件)
- 表单form的method属性值必须设为post
- 表单form的enctype属性值默认为urlencoded,格式是key1=value1&key2=value2
- 表单form的enctype属性值也必须设为multipart/form-data
②服务端PHP可以通过$_FILES获取上传的文件信息
<?php if($_SERVER['REQUEST_METHOD']==='POST'){ echo '<pre>'; var_dump($_FILES); /* array(1) { ["img"]=>array(5) { ["name"]=>string(26) "QQ截图20180615150657.png" ["type"]=>string(9) "image/png" ["tmp_name"]=>string(27) "C:WindowsTempphp5B71.tmp" ["error"]=>int(0) ["size"]=>int(10812) } } */ } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>案例</title> </head> <body> <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post" enctype="multipart/form-data"> <input type="file" name="img"> <button>提交</button> </form> </body> </html>
二、服务端处理
<?php function upload(){ if(!isset($_FILES['img'])){ //客户端提交的表单内容中没有文本域 $GLOBALS['message']="请上传文件"; return; } $img=$_FILES['img']; /*举例:如果提交成功服务端接收的是类似下面的一个关联数组 array(1) { ["img"]=>array(5) { ["name"]=>string(26) "QQ截图20180615150657.png" ["type"]=>string(9) "image/png" ["tmp_name"]=>string(27) "C:WindowsTempphp5B71.tmp" ["error"]=>int(0) ["size"]=>int(10812) } } */ if($img['error']!==UPLOAD_ERR_OK){ //服务端没有接收到上传的文件 $GLOBALS['message']="上传失败"; return; } //接收了文件,将文件从临时目录tmp_name移动到网站范围之内 $source=$img['tmp_name'];//源文件位置:C:WindowsTempphp5B71.tmp $target='./test/'.$img['name'];//目标位置:移动到文件夹test $moved=move_uploaded_file($source,$target); if(!$moved){ $GLOBALS['message']='上传失败'; return; } //移动成功(上传了) $GLOBALS['message']= '上传成功'; } if($_SERVER['REQUEST_METHOD']==='POST'){ upload(); } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>案例</title> </head> <body> <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post" enctype="multipart/form-data"> <input type="file" name="img"> <button>提交</button> <p><?php echo isset($GLOBALS['message'])?$GLOBALS['message']:'';?></p> </form> </body> </html>
三、解决文件上传大小的限制问题
- 修改php.ini中的post_max_size配置,让服务端可以接受更大的请求体体积
- 修改php.ini中的upload_max_filesize配置,让服务端可以支持更大的单个上传文件