PHP clase de operaciones comunes de archivos

Algunos proyectos serán utilizados en las operaciones de archivo habituales en esta clase encapsula una operación simple de archivos, para su uso posterior.

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
Publicado 16 artículos originales · ganado elogios 2 · Vistas 1194

Supongo que te gusta

Origin blog.csdn.net/qq_39075021/article/details/104041387
Recomendado
Clasificación