码迷,mamicode.com
首页 > 其他好文 > 详细

文件操作

时间:2015-07-17 08:23:33      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

文件操作

文件操作

/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 扩展中断

设置允许的文件类型

  1. 通过表单
    <input type="file" name="myfile" accept="MIME_TYPE" />
    MIME_TYPE:
      image/jpeg,image/png,image/gif...
    
  2. 通过 php 验证
    获取后缀名:
    $ext = strtolower(end(explode(‘.‘, $filename)));
    $ext = pathinfo($filename, PATHINFO_EXTENSION);
    

    设置允许的文件类型:

    $arrExt = ‘jpeg‘, ‘png‘, ‘gif‘;
    if (! in_array($ext, $arrExt)) {
       exit("非法文件类型");
    }
    
  3. 验证是否是真正的图片
    if (!getimagesize($tmp_name)) {
        exit("不是真正的图片");
    }
    

常见的问题

权限问题:

chmod o+w upload

确认不是这些错误之后,那么应该是 SeLinux 的问题

sudo setenforce 0

文件操作

标签:

原文地址:http://www.cnblogs.com/sunznx/p/4653384.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!