1 文件操作
1.1 将字符串写入文件
1 2 3
| <?php $str="床前明月光,\r\n疑是地上霜。\r\n举头望明月,\r\n低头思故乡。"; file_put_contents('./test.txt',$str);
|
小结:
1、 所有的“写”操作都是清空重写
2、在文本中换行是\r\n
1 2 3
| \r:回车 光标移动到当前行的最前面 \n:换行 将光标下移动一行 按键盘的回车键做了两步,第一步将光标移动到当前行的最前面,第二步下移一行。
|
3、\r\n是特殊字符,必须放在双引号内
1.2 将整个文件读入一个字符串
1 2 3 4 5 6
| echo file_get_contents('./test.txt');
readfile('./test.txt');
|
1.3 打开文件并操作
1 2 3 4 5
| fopen(地址,模式) 打开文件 模式: r:读 read w:写 write a:追加 append
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
$fp=fopen('./test.txt','a'); fputs($fp,'在河之洲');
|
小结:
1、打开文件,返回文件指针(文件指针就是文件地址),资源类型
2、打开文件写、追加操作,如果文件不存在,就创建新的文件
3、打开文件读操作,文件不存在就报错
4、fputs()写一行,fgets()读一行,fclose()关闭文件
5、追加是在文件的末尾追加
1.4 是否是文件【is_file()】
1
| echo is_file('./test.txt')?'是文件':'不是文件';
|
1.5 判断文件或文件夹是否存在【file_exists()】
1
| echo file_exists('./test.txt')?'文件存在':'文件不存在';
|
1.6 删除文件【unlink】
1 2 3 4 5 6 7 8 9
| $path='./test.txt'; if(file_exists($path)){ if(is_dir($path)) rmdir($path); elseif(is_file($Path)) unlink($path); }else{ echo '文件夹或文件不存在'; }
|
1.7 二进制读取【fread(文件指针,文件大小)】
文件的存储有两种:字符流和二进制流
二进制流的读取按文件大小来读的。
1 2 3 4
| $path='./face.jpg'; $fp=fopen($path,'r'); header('content-type:image/jpeg'); echo fread($fp,filesize($path));
|
多学一招:file_get_contents()也可以进行二进制读取
1 2
| header('content-type:image/jpeg'); echo file_get_contents('./face.jpg');
|
小结:
1、文本流有明确的结束符,二进制流没有明确的结束符,通过文件大小判断文件是否读取完毕
2、file_get_contents()既可以进行字符流读取,也可以进行二进制读取。
2 表单提交数据的两种方式
2.1 两种方式
1、get
2、post
1 2
| <form method="post" action=""></form> <form method="get" action=""></form>
|
2.2 区别
1、外观上看
get提交在地址上可以看到参数
post提交在地址栏上看不到参数
2、安全性
get不安全
post安全
3、提交原理
get提交是参数一个一个的提交
post提交是所有参数作为一个整体一起提交
4、提交数据大小
get提交一般不超过255个字节
post提交的大小取决于服务器
5、灵活性
get很灵活,只要有页面的跳转就可以传递参数
post不灵活,post提交需要有表单的参与
1 2 3 4 5 6 7 8 9 10 11 12
| 1、 html跳转 <a href="index.php?name=tom&age=20">跳转</a>
2、JS跳转 <script type="text/javascript"> location.href='index.php?name=tom&age=20'; location.assign('index.php?name=tom&age=20'); location.replace('index.php?name=tom&age=20'); </script>
3、PHP跳转 header('location:index.php?name=tom&age=22')
|
小结:
1 2
| <form method="post" action=""></form> <form method="get" action=""></form>
|
3 服务器接受数据的三种方式
通过名字获取名字对应的值
1 2 3
| $_POST:数组类型,保存的POST提交的值 $_GET:数组类型,保存的GET提交的值 $_REQUEST:数组类型,保存的GET和POST提交的值
|
在一个请求中,既有get又有post,get和post传递的名字是一样的,这时候通过$_REQUET获取的数据是什么?
答:结果取决于配置文件
小结:
1、在开发的时候,如果明确是post提交就使用$_POST
获取,如果明确get提交就用$_GET
获取
2、request获取效率低,尽可能不要使用,除非提交的类型不确定的情况下才使用。
4 参数传递
4.1 复选框值的传递
复选框的命名要注意带’[]’。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <body> <?php if(isset($_POST['button'])) { print_r($_POST['hobby']); } ?> <form method="post" action=""> 爱好: <input type="checkbox" name="hobby[]" value='爬山'>爬山 <input type="checkbox" name="hobby[]" value='抽烟'>抽烟 <input type="checkbox" name="hobby[]" value='喝酒'>喝酒 <input type="checkbox" name="hobby[]" value='烫头'>烫头 <input type="submit" name="button" value="提交"> </form> </body>
|
小结:
1、表单提交到本页面需要判断一下是否有post提交
2、数组的提交表单元素的名字必须带有[]
5 文件上传
开发中需要上传图片、音乐、视频等等,这种上传传递是二进制数据。
5.1 客户端上传文件
文件域
1
| <input type="file" name="image">
|
表单的enctype属性
默认情况下,表单传递是字符流,不能传递二进制流,通过设置表单的enctype属性传递复合数据。
enctype属性的值有:
- application/x-www-form-urlencoded:【默认】,表示传递的是带格式的文本数据。
- multipart/form-data:复合的表单数据(字符串,文件),文件上传必须设置此值
- text/plain:用于向服务器传递无格式的文本数据,主要用户电子邮件
单词
1 2
| multipart:复合 form-data:表单数组
|
5.2 服务器接受文件
超全局变量$_FILES
是一个二维数组,用来保存客户端上传到服务器的文件信息。二维数组的行是文件域的名称,列有5个。
1、$_FILES[][‘name’]
:上传的文件名
2、$_FILES[][‘type]
:上传的类型,这个类型是MIME类型(image/jpeg、image/gif、image/png)
3、$_FILES[][‘size’]
:文件的大小,以字节为单位
4、$_FILES[][‘tmp_name’]
:文件上传时的临时文件
5、$_FILES[][‘error’]
:错误编码(值有0、1、2、3、4、6、7)0表示正确
$_FILES[][‘error’]
详解
值 |
错误描述 |
0 |
正确 |
1 |
文件大小超过了php.ini中允许的最大值 upload_max_filesize = 2M |
2 |
文件大小超过了表单允许的最大值 |
3 |
只有部分文件上传 |
4 |
没有文件上传 |
6 |
找不到临时文件 |
7 |
文件写入失败 |
注意:MAX_FILE_SIZE必须在文件域的上面。
只要掌握的错误号:0和4
5.3 将上传文件移动到指定位置
函数:
1
| move_uploaded_file(临时地址,目标地址)
|
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <body> <?php if(!empty($_POST)) { if($_FILES['face']['error']==0){ move_uploaded_file($_FILES['face']['tmp_name'],'./'.$_FILES['face']['name']); }else{ echo '上传有误'; echo '错误码:'.$_FILES['face']['error']; } } ?> <form method="post" action="" enctype='multipart/form-data'> <input type="file" name="face"> <input type="submit" name="button" value="上传"> </form> </body>
|
小结:上传的同名的文件要给覆盖
5.4 与文件上传有关的配置
1 2 3 4 5 6 7 8 9
| post_max_size = 8M:表单允许的最大值
upload_max_filesize = 2M:允许上传的文件大小
upload_tmp_dir =F:\wamp\tmp:指定临时文件地址,如果不知道操作系统指定
file_uploads = On:是否允许文件上传
max_file_uploads = 20:允许同时上传20个文件
|
6 优化文件上传
6.1 更改文件名
方法一:通过时间戳做文件名
1 2 3 4
| <?php $path='face.stu.jpg';
echo time().rand(100,999).strrchr($path,'.');
|
方法二:通过uniqid()实现
1 2 3 4
| $path='face.stu.jpg'; echo uniqid().strrchr($path,'.'),'<br>'; echo uniqid('goods_').strrchr($path,'.'),'<br>'; echo uniqid('goods_',true).strrchr($path,'.'),'<br>';
|
6.2 验证文件格式
方法一:判断文件的扩展名(不能识别文件伪装)
操作思路:将文件的后缀和允许的后缀对比
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <body> <?php if(!empty($_POST)) { $allow=array('.jpg','.png','.gif'); $ext=strrchr($_FILES['face']['name'],'.'); if(in_array($ext,$allow)) echo '允许上传'; else echo '文件不合法'; } ?> <form method="post" action="" enctype='multipart/form-data'> <input type="file" name="face"> <input type="submit" name="button" value="上传"> </form> </body>
|
注意:比较扩展名不能防止文件伪装。
方法二:通过$_FIELS[]['type']
类型(不能识别文件伪装)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <body> <?php if(!empty($_POST)) { $allow=array('image/jpeg','image/png','image/gif'); $mime=$_FILES['face']['type']; if(in_array($mime,$allow)) echo '允许上传'; else echo '文件不合法'; } ?> <form method="post" action="" enctype='multipart/form-data'> <input type="file" name="face"> <input type="submit" name="button" value="上传"> </form> </body>
|
注意:比较$_FIELS[]['type']
不能防止文件伪装。
方法三:php_fileinfo扩展(可以防止文件伪装)
在php.ini中开启fileinfo扩展
1
| extension=php_fileinfo.dll
|
注意:开启fileinfo扩展以后,就可以使用finfo_*的函数了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <body> <?php if(!empty($_POST)) { $info=finfo_open(FILEINFO_MIME_TYPE); $mime=finfo_file($info,$_FILES['face']['tmp_name']); $allow=array('image/jpeg','image/png','image/gif'); echo in_array($mime,$allow)?'合法':'不合法'; } ?> <form method="post" action="" enctype='multipart/form-data'> <input type="file" name="face"> <input type="submit" name="button" value="上传"> </form> </body>
|
小结:验证文件格式有三种方法
1、可以验证扩展名(不可以防止文件伪装)
2、通过$_FILES[]['type']
验证(不可以防止文件伪装)
3、通过file_info扩展(可以防止文件伪装)