本节课学习了文件常用操作
1、编程: 文件上传与检测
课后老师总结摘录如下:
系统变量: $_FILES是一个二维数组, 一维是当前的文件上件控件的名称, 就是name属性值
二维是它的当前属性, 最重要的有以下几个:
$_FILES['file']['name']: 文件原始名称
$_FILES['file']['type']: 文件类型
$_FILES['file']['size']: 上传的文件大小
$_FILES['file']['tmp_name']: 服务器上的临时文件夹
$_FILES['file']['error']: 上传错误代码
$_SERVER['PHP_SELF']:当前php脚本
enctype = "multipart/form-data" :允许通过表单上传文件
method:请求类型必须是POST
处理脚本的三种语法:
(1)最严格的写法:$_SERVER['PHP_SELF']:建议实际工作中用htmlspecialchars()进行防跨域攻击处理
(2)最死板的写法, 直接写上当前文件名: demo6.php
(3)最懒的写法: 空, 啥与不写, 默认就是提交到当前页面的php脚本处理
<!--//感恩 //认真的人该变了自己,坚持的人改变了命运! //日行一善,改变命运! <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="POST" enctype="multipart/form-data"> <fieldset> <legend>文件上传</legend> <p>选择文件:<input type="file" name="upload"></input></p> </fieldset> <p><button type="submit" name="submit">提交</button></p> </form> <?php //检测类型是否为POST if ('POST' == $_SERVER['REQUEST_METHOD']) { if (!isset($_FILES['upload'])) { if ($_FILES['upload']['error'] > 0) { echo "<p>错误原因是:{$_FILES['upload']['error']}<strong>"; } return; } $allow = ['image/jpg', 'image/jpeg', 'image/png']; $fileType = $_FILES['upload']['type']; if (!in_array($fileType, $allow)){ echo "<script>alert('仅允许上传jpg和png图片');</script>"; return;} $tmpDir = $_FILES['upload']['tmp_name']; $uploadPathAndName = $_FILES['upload']['name']; if (!move_uploaded_file($tmpDir, $uploadPathAndName)) { echo "<script>alert('上传失败');</script>"; return; } echo "<script>alert('上传成功!');</script>"; } ?>
点击 "运行实例" 按钮查看在线实例
2、编程: 目录遍历
老师讲义如下:
第一种方式: 传统目录函数
第1步: opendir('目录')打开目录,成功返回资源,失败返回false
第2步: readdir($dir)读取目录内容,世功返回文件名,失败返回false
第3步: closedir($dir)关闭当前目录
第二种方式:将目录内容保存到数组中进行遍历
第1步:scandir($dir)将目录转数组中保存
第2步:遍历目录数组
<?php //感恩 //认真的人该变了自己,坚持的人改变了命运! //日行一善,改变命运! /** * 目录遍历操作: * 1. 传统过程函数: opendir(),readdir(),closedir() * 2. 目录扫描器: scandir() */ //读到一个目录内容到数组中: $fileArr= scandir('../0827'); foreach($fileArr as $file){ if($file!="."&&$file!=".."){ echo "$file <br>"; } }
点击 "运行实例" 按钮查看在线实例
3、课堂总结
(1)文件操作的基本过程
* 打开文件;
* 操作文件:读写追加等;
* 关闭文件。
a)创建或打开一个本地文件
以r(只读)方式打开文件,不会创建新文件, 类似: r+(读写),指针在开头
$fh = fopen('file1.txt', 'r') or die("不能打开file1.txt文件");
以w(只写)方式打开文件,如文件不存在则创建, 类似: w+(读写),指针在开头
$fh = fopen('file2.txt', 'w') or die("不能打开file2.txt文件");
以a(追加只写)方式打开文件,如文件不存在则创建, 类似: a+(追加读写),指针在未尾
$fh = fopen('file3.txt', 'a') or die("不能打开file3.txt文件");
在windows机器上建议读写模式符添加b,以增强对二进制文件的兼容性,如rb,wb...
b)打开一个远程文件
$fh = fopen('http://www.php.cn/course/801.html', 'r');
c)读取文件到浏览器
从文件指针处读取一行并自动下移
while ($s = fgets($fh)) {
print $s;
}
d)fgetss()可过滤掉所有的html标签
e). 读取文件到字符串:
file_get_contens($filename)返回字符串
将整个页面读入到一个字符串,这在抓取其它网站内容时很有用,配合过滤正则
<?php $content = file_get_contents('file.txt'); $content = file_get_contents('http://www.php.cn'); echo '文件大小: '.strlen($content).' 字节', '<br>'; if (strlen($content) > 0) { echo $content; }
点击 "运行实例" 按钮查看在线实例
f). 把整个文件读入到数组中,用换行符进行分割
<?php $arr = file('maxim.txt'); foreach ($arr as $key => $value) { echo '<span style="color:red">格言'.($key+1).': </span>'.$value.'<hr>'; }
点击 "运行实例" 按钮查看在线实例
g)文件读写完成后,应该及时关闭
fclose($fh);
h)关闭脚本后,文件也会自动关闭,但还是强烈推荐手工显示式关闭,这是一个好习惯。
(2)//系统常量__FILE__
a.获取文件名
echo '文件名: '.basename(__FILE__).'<br>';
b.获取目录名
echo '目录名: '.dirname(__FILE__).'<br>';
//php5.3+推荐使用常量__DIR__代替dirname()
echo __DIR__, '<br>';
c.pathinfo():将目录名,文件名,扩展或解析到一个数组中
$pathinfo = pathinfo(__FILE__);
echo '目录名:', $pathinfo['dirname'],'<br>';
echo '文件名:', $pathinfo['basename'],'<br>';
echo '扩展名:', $pathinfo['extension'],'<br>';
d.php中没有提供将这三个部分组成一个完整文件名的函数
//因为windows与unix上的目录分隔符不同
//windows是正斜线:/ , unix/linux上的是反斜线\
//所以系统提供一个常量:DIRECTORY_SEPARATOR,可以根据系统自动确定路径分隔符类型
$path = dirname(__FILE__).DIRECTORY_SEPARATOR.basename(__FILE__);
echo $path,'<br>';
var_dump($path==__FILE__); //, $path与__FILE__完全相同
(3)文件操作
删除文件:unlink(file)
复制copy(old, new)
更名:rename(old,new):二个参数在同一目录下
移动:rename(old,new):二个参数在不同的目录下
创建目录: mkdir(dirname)
删除目录
先清空目录
unlink('admin/file.txt');
rmdir('admin');