PHPの一般的なファイル操作クラス

いくつかのプロジェクトは、後で使用するために、単純なファイル操作をカプセル化し、このクラスでは通常のファイル操作に使用されます。

class FileOperations
{

    public function __construct()
    {
        //引入PclZip压缩解压缩类
        include_once 'pclzip/PclZip.php';
    }

    /**
     * @param string $file_name 压缩后文件名称
     * @param array $path 文件数组
     * @return array
     */
    public function toZip($file_name, $path)
    {
        $res = array();
        $archive = new PclZip($file_name);
        $v_list = $archive->create($path, PCLZIP_OPT_REMOVE_ALL_PATH);

        if ($v_list == 0) {
            $res['status'] = 0;
            $res['msg'] = '源文件不存在!<br>' . $archive->errorInfo(true);
        } else {
            $res['status'] = 1;
            $res['msg'] = '文件打包完成!';
            $res['fileName'] = basename($file_name);
        }
        return $res;
    }

    /**
     * @param  arrar $folderArr 文件夹路径数组
     * @return array  文件目录列表中所有子目录文件路径
     */
    public function getArrFileList($folderArr)
    {
        $file_list = [];
        if (is_array($folderArr) && count($folderArr) > 0) {
            foreach ($folderArr as $file) {
                if (is_dir($file)) {
                    $list = $this->getFileList($file);
                    foreach ($list as $flist)
                        $file_list[] = $flist;
                } else {
                    $file_list[] = $file;
                }
            }
        }
        return $file_list;
    }

    /** 获取文件夹下所有子文件路径并存放到一个数组中
     * @param String $path 文件夹
     * @return array
     */
    public function getFileList($path)
    {
        $list = array();
        foreach (glob($path . '/*') as $single) {
            if (is_dir($single)) {
                $list = array_merge($list, $this->getFileList($single));
            } else {
                $list[] = $single;
            }
        }
        return $list;
    }


    /** 获取文件size大小
     *  @param string $file 文件路径
     */
    public function getFileSize($file)
    {
        $byt = 1024;
        $mb = pow($byt, 2);
        $file_szie = filesize($file);
        if ($file_szie >= $mb) {
            $fsize = round($file_szie / $mb, 1) . 'mb';
        } elseif ($file_szie >= $byt) {
            $fsize = round($file_szie / $byt, 1) . 'kb';
        } else {
            $fsize = $file_szie . 'bytes';
        }
        return $fsize;
    }

    /** 判断文件夹是否存在,不存在则创建
     * @param string $dir 要创建的文件夹
     */
    public function createDir($dir)
    {
        if (!is_dir($dir)) {
            mkdir($dir, 0777, true); //创建目录,第三个参数可选,规定是否设置递归模式。(PHP 5 中新增的)
        }
    }

    /**  复制带有多级子目录的文件夹
     * @param string $source 要复制的文件对象路径
     * @param string $target 复制到的目标文件路径
     * @param bool $remove 是否删除
     * @return bool|string
     */
    public function copyDir($dirSrc, $dirTo, $remove = false)
    {
        // 检查原始目录是否存在, 不存在则退出
        if (!file_exists($dirSrc)) {
            return 'source_error';
        }

        $this->createDir($dirTo); //判断目标文件夹是否存在,不存在则创建

        if ($dir_handle = opendir($dirSrc)) {         //打开目录,并判断是否能成功打开
            while ($filename = readdir($dir_handle)) {          //循环遍历目录下的所有文件
                if ($filename != "." && $filename != "..") {        //一定要排除两个特殊的目录
                    $subFile = $dirSrc . "/" . $filename;           //将目录下的子文件和当前目录相连
                    $sunToFile = $dirTo . "/" . $filename;          //将目标目录的多级子目录相连
                    if (is_dir($subFile))                           //如果为目录则条件成立
                        $this->copyDir($subFile, $sunToFile);       //递归调用自己复制子目录
                    if (is_file($subFile))                          //如果是文件则条件成立
                        copy($subFile, $sunToFile);                 //直接复制到目标位置
                }
            }
            closedir($dir_handle); //关闭文件资源
        }

        if ($remove == true) //是否删除原始文件
            $this->delDir($dirSrc);
    }

    /** 删除目录及目录下所有文件
     *  @param string $dir 文件夹路径
     */
    public function delDir($dir)
    {
        $res = 0;
        if (is_dir($dir)) {
            if ($delHandle = opendir($dir)) {
                while (($file = readdir($delHandle)) != false) {
                    if ($file != '..' && $file != '.') {
                        if (is_dir($dir . '/' . $file))             // 是目录
                        {
                            $this->delDir($dir . '/' . $file);      // 是目录则递归继续进入该目录中去删除其中的文件
                        } else                                      // 是文件
                        {
                            unlink($dir . '/' . $file);             // 则直接删除文件
                        }
                    }
                }
            }
            closedir($delHandle);
            $res = rmdir($dir); //删除空的目录
        } else {
            if (is_file($dir)) {
                $res = unlink($dir);
            }
        }
        return $res;
    }

    /** 文件导出/下载
     * @param string $filePath 文件路径
     */
    public function expotFile($filePath)
    {
        Header("Content-type: text/html; charset=utf-8");
        if (!file_exists($filePath)) {
            exit("文件不存在!");
        } else {
            $fileName = iconv("utf-8", "gb2312//IGNORE", basename($filePath));  //转码
            $fileSize = filesize($filePath);  //文件大小
            $file = fopen($filePath, "rw");
            Header("Content-type: application/octet-stream");
            Header("Accept-Ranges: bytes");
            Header("Accept-Length: " . $fileSize);
            Header("Content-Disposition: attachment; filename=" . $fileName);
            echo fread($file, $fileSize);
            fclose($file);
        }
    }

    /**
     * @param $filePath 要下载的文件路径
     * @param array $allowDownExt  允许下载的文件扩展名数组
     */
    function downFile($filePath, $allowDownExt = ['zip'])
    {
        header("Content-type: text/html; charset=utf-8");

        if (!is_file($filePath) || !is_readable($filePath)) {
            exit("文件不存在或者不可读!");
        }

        $ext = strtolower(pathinfo($filePath, PATHINFO_EXTENSION));
        if (!in_array($ext, $allowDownExt)) {
            exit("不允许的文件格式!");
        }

        $fileName = iconv("utf-8", "gb2312//IGNORE", basename($filePath));  //转码
        $fileSize = filesize($filePath);  //文件大小
        // 对当前文档禁用缓存
        /*header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
        header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
        header('Pragma: no-cache');*/
        header("content-type: application/octet-stream");
        header("Accept-Ranges: bytes");
        header("Accept-Length: " . $fileSize);
        header("Content-Disposition: attachment; filename=" . $fileName);
        $read_buffer = 1024;
        $sum_buffer = 0;
        $handle = fopen($filePath, 'rb');
        while (!feof($handle) && ($sum_buffer < $fileSize)) {
            echo fread($handle, $read_buffer);
            $sum_buffer += $read_buffer;
        }
        fclose($handle);
        exit;
    }
    
}
UFI
公開された16元の記事 ウォンの賞賛2 ビュー1194

おすすめ

転載: blog.csdn.net/qq_39075021/article/details/104041387