php 文件操作 原创

深处莫神
发布于 2022-8-25 09:26
浏览
0收藏

@toc

文件操作

php 文件操作-鸿蒙开发者社区

获取文件数据

1.首先一点,我们是在所写文件的父亲目录下进行的操作。
2.获取文件路径,需要注意文件路径需要变成/才能 $path = str_replace("\\", "/", dirname(__FILE__));

文件和文件夹的区分

3.获得文件路径之后,获得的路径目录下是包含有文件和文件夹两种类型的,需要对文件和文件夹进行不同的区别,文件需要获取文件类型为本身的后缀例如:txt,同时二者的操作也是对应不同的,要根据类型的不同进行填写。

//准备数组分别存放
$dirs = [];
$files = [];

//读取文件夹的方法,scandir() 函数返回指定目录中的文件和目录的数组。
$list = scandir($path);

//循环遍历
foreach($list as $item)
{
   //.当前文件夹和..上一级文件夹 是系统自带的,需要跳过
    if($item == "." || $item == "..")
    {
        continue;
    }

    //组装子文件夹的路径,拼接
    $current = $path.'/'.$item;

    //判断是什么类型的文件
    if(is_dir($current))
    {
        //是文件夹
        $dirs[] = [
            'name'=>$item, //文件名
            'type'=> '文件夹', //类型
            'size'=>FileTotal(filesize($current)), //算大小
            'time'=>date('Y-m-d H:i', filectime($current)) //创建时间
        ];
    }
    
    if(is_file($current))
    {
        //是文件
        $files[] = [
            'name'=>$item, //文件名
            'type'=>pathinfo($item, PATHINFO_EXTENSION), //文件类型的后缀
            'size'=>FileTotal(filesize($current)), //大小
            'time'=>date("Y-m-d H:i", filectime($current)), //时间
        ];
    }
}

数据填入表格

4.获取到数据之后,将获取的信息填入到表格之中,此时会用到 高级分离术(需要在html或其他地方使用php语法时候需要进行嵌套)—即就是将循环分成两半

知识点
pathinfo(path, options)函数~~例如(/documents/gfg.txt)~~会根据options不同返回目录名( /documents),基本名( gfg.txt),扩展名(txt)
//文件
   <?php foreach($files as $item){?>
        <tr>
            <td><?php echo $item['name'];?></td>
            <td><?php echo $item['type'];?></td>
            <td><?php echo $item['size'];?></td>
            <td><?php echo $item['time'];?></td>
            <td>
                <a href="info.php?path=<?php echo $path; ?> &filename=<?php echo $item['name'];?>">编辑</a>
                <a data-old="<?php echo $path.'/'.$item['name']?>" onclick="EditFile(this)" href="#">重命名</a>
                <a data-file="<?php echo $path.'/'.$item['name']?>" onclick="DelFile(this)" href="#">删除</a>
            </td>
        </tr>
        <?php }?>
//文件夹
 <?php foreach($dirs as $item){?>
        <tr>
            <td>
                <a href="index.php?path=<?php echo $path.'/'.$item['name'];?>">
                    <?php echo $item['name'];?>
                </a>
            </td>
            <td><?php echo $item['type'];?></td>
            <td><?php echo $item['size'];?></td>
            <td><?php echo $item['time'];?></td>
            <td>
                <a href="javascript:void(0)">重命名</a>
                <a href="javascript:void(0)">删除</a>
                <a href="javascript:void(0)">强制删除</a>
            </td>
        </tr>
        <?php 
    }?>

字节大小转换

5.获取字节大小需要往上搜素相关转换函数,把其转换为以KB,GB,MB,字节为单位的文件大小

//转换字节大小单位
// $filesize 文件大小
function FileTotal($filesize = 0) 
{
    if ($filesize >= 1073741824) {
        $filesize = round($filesize / 1073741824 * 100) / 100 . ' GB';
    } elseif ($filesize >= 1048576) {
        $filesize = round($filesize / 1048576 * 100) / 100 . ' MB';
    } elseif ($filesize >= 1024) {
        $filesize = round($filesize / 1024 * 100) / 100 . ' KB';
    } else {
        $filesize = $filesize . ' 字节';
    }
 
    return $filesize;
}

字节计算

文件夹字的总和应该等于文件夹里包含的所有文件的文件字节之和。主要是用队列存储第一级的文件(大队列),然后从第一级文件的第一个文件开始扫描里面所包含的文件,如果是文件夹,入队小队列,是文件计算字节,双重循环即可计算。

function dirsize($dir) {
    if (!is_dir($dir)) {
        return filesize($dir);
    }
    // 统计文件夹内所有文件大小之和
    $total_size = 0;
    // 用队列存储文件夹路径(按照广度优先搜素进行遍历)
    $dir_queue = [$dir];
    
    for ($front=0; $front < sizeof($dir_queue); $front++) {
        // 取队列头元素
        $path = $dir_queue[$front];
        // var_dump($path);
        // 扫描文件
        $list = scandir($path);
        foreach($list as $item)
        {
            if($item == "." || $item == "..")
            {
                continue;
            }

            //组装子文件夹的路径
            $current = $path.'/'.$item;

            //判断是文件夹就入队
            if(is_dir($current))
            {
                //是文件夹
                $dir_queue[] = $current;
            }
            
            // 是文件就计算大小
            if(is_file($current))
            {
                //是文件
                $total_size += filesize($current);
            }
        }
    }
    return $total_size;
}

文件新建操作

6.文件操作–新建文件,点击按钮触发新建文件事件,文件名称为空则创建失败,\s匹配空白字符,文件名字不允许出现空白格。

 <a id="AddFile" href="#">创建文件</a>
<script>
     //获取元素
        var AddFile = document.getElementById('AddFile')
        //绑定事件
        AddFile.onclick = function () {
            //输入框
            var filename = prompt('请输入创建的文件名称')

            if (filename == null) {
                return false
            }

            //js替换 null
            filename = filename.replace(/\s/g, "")

            //内容为空
            if (filename) {
                //将输入的文件名称传递给php
                //地址跳转传参
                // action作用是我自己自定义的用来区分用户是做什么操作
                location.href = `index.php?path=${path}&filename=${filename}&action=addfile`
                return false
            } else {
                alert('文件名称不能为空')
                return false
            }
        }
</script>

7.action跳转行为 action=addfile

知识点
file_put_contents() 函数把一个字符串写入文件中。
//创建文件
if($action == "addfile")
{
    //index.php?path=/Applications/MAMP/htdocs/class/php/filesystem/demo/hello & filename=index.txt & action=addfile
    $filename = isset($_GET['filename']) ? trim($_GET['filename']) : '';

    if(empty($filename))
    {
        ShowMsg('新的文件名称不能为空');
        exit;
    }

    $filename = $path.'/'.$filename;

    //如果这个文件存在就不能重复创建
    if(is_file($filename))
    {
        ShowMsg('文件已存在');
        exit;
    }

    //创建文件 返回写入的长度
    $result = file_put_contents($filename, " ");

    if($result)
    {
        ShowMsg('创建文件成功', "index.php?path=$path");
        exit;
    }else
    {
        ShowMsg('创建文件失败');
        exit;
    }
}

新建文件夹操作

7.文件操作–新建文件夹,与新建文件基本相同

知识点
mkdir() 函数创建目录。
   <a id="AddDir" href="#">创建文件夹</a>
  var AddDir = document.getElementById('AddDir')

      //绑定事件
    AddDir.onclick = function()
    {
        //输入框
        var dirname = prompt('请输入创建的文件夹的名称')

        if(dirname == null)
        {
            return false
        }

        //js替换 null
        dirname = dirname.replace(/\s/g, "")

        //内容为空
        if(dirname)
        {
            //将输入的文件名称传递给php
            //跳转传参
            // action作用是我自己自定义的用来区分用户是做什么操作
            location.href = `index.php?path=${path}&dirname=${dirname}&action=adddir`
            return false
        }else
        {
            alert('文件夹名称不能为空')
            return false
        }

        
    }

7.action跳转行为 action=adddir


// 创建文件夹
if($action == "adddir")
{
    //index.php?path=/Applications/MAMP/htdocs/class/php/filesystem/demo/hello & filename=index.txt & action=addfile
    $dirname = isset($_GET['dirname']) ? trim($_GET['dirname']) : '';

    if(empty($dirname))
    {
        ShowMsg('新的文件夹名称不能为空');
        exit;
    }

    $dirname = $path.'/'.$dirname;
    // echo  $dirs['type']='文件夹';

    // var_dump($dirname);
    // exit;

    // 设置创建的文件类型为文件夹
    
    //如果这个文件存在就不能重复创建
    if(is_dir($dirname))
    {
        ShowMsg('文件夹已存在');
        exit;
    }

    //创建文件夹 返回写入的长度
    $result = mkdir($dirname);

    if($result)
    {
        ShowMsg('创建文件夹成功', "index.php?path=$path");
        exit;
    }else
    {
        ShowMsg('创建文件夹失败');
        exit;
    }
}

文件删除操作

8.删除文件

<a data-file="<?php echo $path.'/'.$item['name']?>" onclick="DelFile(this)" href="#">删除</a>
  //删除文件
    // data-file js自定义属性
    function DelFile(that)
    {
        //获取this元素自身的自定义属性 data-file
        var filename = that.dataset.file

        //弹框
        if(confirm('是否确认删除文件'))
        {
            //真删除
            //跳转传参
            location.href = `index.php?path=${path}&filename=${filename}&action=delfile`
            return false
        }
    }

删除文件 action=delfile

知识点
unlink() 函数删除文件。
@ 即就是error control operator,预制符,抑制警告等非致命错误
//删除文件
if($action == "delfile")
{
    //接收要删除的文件名称
    $filename = isset($_GET['filename']) ? trim($_GET['filename']) : '';

    //判断变量是否为空
    if(empty($filename))
    {
        ShowMsg('删除的文件名称为空');
        exit;
    }

    //判断文件是否存在
    if(!is_file($filename))
    {
        ShowMsg('要删除的文件不存在');
        exit;
    }

    //删除文件 删除成功返回true 否则false
    $result = @unlink($filename);

    if($result)
    {
        ShowMsg('文件删除成功', "index.php?path=$path");
        exit;
    }else
    {
        ShowMsg('文件删除失败');
        exit;
    }
}

文件重命名

column1
prompt(msg,defaultText)------ msg:要在对话框显示的文本 defaultText:默认输入的文本
substr(string,start<,length>)-----从string 的start位置开始提取字符串
  <a data-old="<?php echo $path.'/'.$item['name']?>" onclick="EditFile(this)" href="#">重命名</a>
   //重命名文件
    function EditFile(that)
    {
        //获取自定义参数
        //旧的文件名
        var old = that.dataset.old;

        //输入一个新的文件名
        var filename = prompt('请输入新的文件名称', old.substr(path.length).replace('/', ''));

        //点击了取消
        if(filename == null)
        {
            return false
        }

        //js替换 null
        filename = filename.replace(/\s/g, "")

        if(filename)
        {
            //传参跳转
            location.href = `index.php?path=${path}&old=${old}&filename=${filename}&action=editfile`
            return false
        }else
        {
            //为空
            alert('请输入新的文件名称')
            return false
        }

    }

文件上传—首先文件上传后需要提交,提交则只有放在表单中才可进行提交操作

   <form>
  	<input type="file" name="file" />
        <button type="submit">提交文件</button>
    </form>

>$_FILES接受文件的超全局变量 ,可以获取通过POST方式上传到服务器的所有文件数据。

// 接受文件的超全局变量 
if($_FILES)
{

    // 调用封装方法
    $result = upload('file', $path); 
    //   文件是否上传成功
   if($result){
       ShowMsg('文件上传成功', "index.php?path=$path");
       exit;
   }
   else{
       ShowMsg('文件上传失败');
       exit;
   }
}

上传文件不能为空,为空的文件被上传是没有任何意义的。通过var_dump($_FILES;)可以查看到文件数组所含有的数组信息,然后分别对数组信息进行相对应情况的判断。

// 文件上传的封装
// $name 表单域中的input file name 属性

function upload($name='file',$path ='',$size=100000,$type=['jpg','jpeg','png','gif'])
{
    // $file = $_FILES;
    // var_dump($file);
    // exit;
    // 获取要上传文件
    $file = isset($_FILES[$name]) ? $_FILES[$name] : [];

    // // 判断内容是否为空
    if(empty($file)){
        ShowMsg('上传文件为空');
        return false;
    }

    // 判断文件是否有上传错误
    $error=isset($file['error']) ? $file['error'] : 0;
    if($error > 0){
            switch($error){
            case 1: 
                ShowMsg('超出了php.ini配置文件的限制大小');
                break;
            case 2:
                ShowMsg('超出了表单所限制的大小');
                break;
            case 3:
                ShowMsg('网络中断');
                break;
            case 4:
                ShowMsg('无文件上传');
                break;
            default:
                ShowMsg('未知错误');

        }
    }


    //    判断文件大小是否超过限制
    if($file['size'] > $size){
        ShowMsg('文件大小超过系统配置');
        exit;
    }

    //判断这个类型在不在数组里面
    $ext = pathinfo($file['name'], PATHINFO_EXTENSION);

    if(!in_array($ext,$type)){
        ShowMsg('上传类型有误,请重新选择');
        return false;
    }

    //    判断所存放文件的目录是否存在
    if(!is_dir($path)){
        // 如果文件夹不存在,则创建文件夹
        // true 是否递归创建
        $CreatRes = mkdir($path,0777,true);
        if(!$CreatRes)
        {
            ShowMsg('文件夹创建失败');
            return false;
        }
    }

    //    给上传的文件起一个新的名字 时间不会重复 
    //    纯文件名
    $filename = pathinfo($file['name'],PATHINFO_FILENAME);
    // // 时间戳
    $time=time();

    // // 拼接新名字
    $newname=$filename.'_'.$time.'.'.$ext; 
    $newname =$path.'/'.$newname;
    // var_dump($newname);
    // exit;

    // 判断文件上传渠道是否正确 安全问题
    if(!is_uploaded_file($file['tmp_name'])){
        ShowMsg('非法上传文件');
        return false;
    }

    // 真正上传 实际上就是移动 路径加文件名
    return move_uploaded_file($file['tmp_name'],$newname);

}

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
标签
已于2022-8-25 09:26:04修改
收藏
回复
举报
回复
    相关推荐