文件操作
/etc/php.ini 配置文件的信息
file_uploads = on upload_max_filesize = 100m # 允许上传文件大小的最大值 post_max_size = 100M # 指通过表单 POST 给 PHP 的所能接收的最大值 upload_tmp_dir = /tmp # 临时文件目录 max_file_uploads = 20 # 最大文件数目
max_execution_time = 600 # 每个 PHP 页面运行的最大时间值 (秒) memory_limit = 128M # 每个 PHP 页面所吃掉的最大内存 max_input_time = 60 # 数据允许的最大时间 (秒) max_input_nesting_level = 60 # 输入变量的嵌套深度
遍历目录的file
opendir, readdir, is_file, is_dir, closedir
function readDirectory($path) { if ($dir[strlen($dir)-1] == ‘/‘) { // 去掉最后的斜线 $dir = substr($dir, 0, -1); } $handle = opendir ($path) or die (‘could not open file‘); while (($item = readdir($handle)) !== false) { if ($item == "." || $item == "..") { continue; } if (is_file($path.‘/‘.$item)) { // is_file $arr[‘file‘][] = $item; } if (is_dir($path.‘/‘.$item)) { // is_dir $arr[‘dir‘][] = $item; } } closedir($handle); return $arr; }
scandir
返回当前目录下文件
$files1 = scandir($dir); $files2 = scandir($dir, 1);
Array ( [0] => . [1] => .. [2] => bar.php [3] => foo.txt [4] => somedir ) Array ( [0] => somedir [1] => foo.txt [2] => bar.php [3] => .. [4] => . )
glob, 用统配符仅列出当前目录
foreach (glob("*.php") as $filename) { echo $filename, ‘<br>‘; }
funclist.txt
funcsummary.txt
quickref.txt
创建文件时候的验证
basename, file_exists, touch
function createFile($filename) { // 验证文件名字是否合法 $pattern = "/[\/, \*, <>, \?, \|]/"; if (preg_match($pattern, basename($filename))) { return ‘非法文件名‘; } else { // 是否有同名文件 if (file_exists($filename)) { return ‘文件存在‘; } else { if (touch($filename)) { // chmod o+w 对目录有写权限 return ‘创建成功‘; } else { return ‘创建失败‘; } } } }
文件内容的函数
$content = file_get_contents($filename); highlight_string($content);
highlight_file($filename); # 直接将文件的内容高亮输出 $content = highlight_file($filename, true); # 将文件 高亮后 的内容赋值给一个字符串
上传文件
<form action="doAction.php" method="post" enctype="multipart/form-data"> <input type="file" name="myfile"><br/> <input type="submit" value="upload file"> </form>
$filename = $_FILES[‘myfile‘][‘name‘]; $type = $_FILES[‘myfile‘][‘type‘]; $tmp_name = $_FILES[‘myfile‘][‘tmp_name‘]; $size = $_FILES[‘myfile‘][‘size‘]; $error = $_FILES[‘myfile‘][‘error‘]; /* 方法 1 */ $destination = dirname(__FILE__).‘/upload/‘.$filename; move_uploaded_file($tmp_name, $destination); /* 方法 2 */ $src = $tmp_name; $dest = dirname(__FILE__).‘/upload/‘.$filename; copy($src, $dest);
判断文件是否是 post 上来的
if (!is_uploaded_file($tmp_name)) { exit("文件不是由 HTTP POST 方式上传的"); }
生成唯一的名字, 防止文件覆盖
$uniName = md5(uniqid(microtime(true), true)); $destination = dirname(__FILE__).‘/upload/‘.$uniName;
mkdir 判断目录不存在, 创建一个目录
$path = dirname(__FILE__).‘/upload/‘; if (!file_exists($path)) { mkdir ($path, 0777, true); // 一般都会加 true chmod ($path, 0777); }
pathinfo
pathinfo($filename, PATHINFO_FILENAME); pathinfo($filename, PATHINFO_DIRNAME); pathinfo($filename, PATHINFO_BASENAME); pathinfo($filename, PATHINFO_EXTENSION);
其他函数
rmdir($path); # 和 linux 的用法一样 touch($filename); filesize($filename); # fifo,char,dir,block,link,file,unknown basename($filename); dirname($filename); filetype($filename);
is_writable(...), is_readable(...), is_executable(...) is_dir(...), is_link(...), is_file(...),
rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt"); unlink(‘test.html‘); cipy(‘example.txt‘, ‘example.txt.bak‘);
date(‘Y-m-d H:i:s‘, filectime($filename)); date(‘Y-m-d H:i:s‘, filemtime($filename)); date(‘Y-m-d H:i:s‘, fileatime($filename));
error 值
0 表示 ok 1 上传的文件大小超过了 upload_max_filesize 2 超过 MAX_FILE_SIZE # <input type="hidden" name="MAX_FILE_SIZE" value="30000"> 3 文件只有一部分被上传 4 文件没有被上传 6 没有找到临时目录 7 文件写入失败 (可能是权限问题) 8 被 php 扩展中断
设置允许的文件类型
- 通过表单
<input type="file" name="myfile" accept="MIME_TYPE" /> MIME_TYPE: image/jpeg,image/png,image/gif...
- 通过 php 验证
获取后缀名:
$ext = strtolower(end(explode(‘.‘, $filename))); $ext = pathinfo($filename, PATHINFO_EXTENSION);
设置允许的文件类型:
$arrExt = ‘jpeg‘, ‘png‘, ‘gif‘; if (! in_array($ext, $arrExt)) { exit("非法文件类型"); }
- 验证是否是真正的图片
if (!getimagesize($tmp_name)) { exit("不是真正的图片"); }
常见的问题
权限问题:
chmod o+w upload
确认不是这些错误之后,那么应该是 SeLinux 的问题
sudo setenforce 0