PHP文件工具类

常用的文件工具类方法,包含创建csv文件、压缩及解压zip文件,下载文件等。
压缩文件(目录)使用方式如:

FileUtils::compressFolder('all.zip', '/data/files/', '*.txt');
 'application/octet-stream',
        'terminate' => true,
    ])
    {
        /**
         * 对应的需要在nginx中配置关联路径
         * location /download {
         *     internal;
         *     alias /data/www/download/;
         * }
         * 如此要在URL中下载 http://domain/download/path/target.xxx 则需要将其放置到
         * /data/www/download/path/target.xxx 中即可,即这种方式是直接发送文件而不用走PHP程序从而节约资源
         */
        $options['mimeType'] = $mimeType;
        $options['saveName'] = $saveName;
        Yii::app()->getRequest()->xSendFile($uri, $options);
    }

    //*************** CSV工具 ******************//

    /**
     * 创建CSV文件
     * @param string $csvFile CSV文件路径
     * @param array  $rows 目标数据
     * @param array  $title 标题
     * @param bool   $compress 是否压缩(压缩后将删除.csv文件)
     * @return string $compress=true时返回压缩文件名,false时返回原文件名
     */
    static function createCSVFile($csvFile, $rows, $title = null, $compress = false)
    {
        if (file_exists($csvFile)) {
            @unlink($csvFile);
        }
        // 生成csv文件(如果文件存在则清空)
        $fh      = fopen($csvFile, 'w');
        $content = '';
        if (is_array($title)) {
            $content .= join(',', $title) . "\r\n";
        }
        foreach ($rows as $row) {
            $content .= join(',', $row) . "\r\n";
        }
        fwrite($fh, $content);
        fclose($fh);
        // 压缩目标文件
        if ($compress) {
            $zipFilename = pathinfo($csvFile, PATHINFO_DIRNAME) . pathinfo($csvFile, PATHINFO_FILENAME) . '.zip';
            self::compress($zipFilename, $csvFile, true);
            return $zipFilename;
        }
        return $csvFile;
    }

    //*************** 文件压缩与解压 ******************//

    /**
     * @var string 临时目录
     */
    protected static $_TMP_PATH = '/tmp/';

    /**
     * @var string 日期时间格式
     */
    protected static $_DATETIME_FORMAT = '';

    /**
     * @var bool 是否增加注释
     */
    protected static $_ADD_COMMENT = false;

    /**
     * @var string 注释文件
     */
    protected static $_COMMENT = 'powered by jgyou.com';

    /**
     * @param bool $open
     */
    static function openComment($open = false, $comment = null)
    {
        self::$_ADD_COMMENT = $open;
        if (null !== $comment) {
            self::$_COMMENT = $comment;
        }
    }

    /**
     * 设置注释
     * @param string $comment
     */
    static function setComment($comment)
    {
        self::$_COMMENT = $comment;
    }

    /**
     * 设置压缩文件日期时间后缀
     * @param string|bool $format string=日期时间格式 bool=开启默认YmdHis
     */
    static function setDatetimeFormat($format = '')
    {
        self::$_DATETIME_FORMAT = true == $format ? 'YmdHis' : $format;
    }

    /**
     * 设置临时文件夹
     * @param string $folder
     */
    static function setTmpFolder($folder)
    {
        self::$_TMP_PATH = $folder;
    }

    /**
     * 解压缩文件
     * @param string $zipFilename
     * @param string $destDir
     * @return bool
     */
    static function extractTo($zipFilename, $destDir = '')
    {
        if (!file_exists($zipFilename)) {
            return false;
        }
        $za = new ZipArchive();
        if ($za->open($zipFilename)) {
            $zipname = pathinfo($zipFilename, PATHINFO_FILENAME) . '/';
            $za->extractTo(($destDir ? pathinfo($destDir, PATHINFO_DIRNAME) : '/tmp/') . $zipname);
            return $za->close();
        }
        return false;
    }

    /**
     * 压缩文件
     * @param string       $zipFilename 输出的压缩文件名
     * @param string|array $srcFilenames 原文件 string=单一文件 array=批量压缩
     * @param bool         $removeSrc 压缩后是否删除原文件
     */
    static function compress($zipFilename, $srcFilenames, $removeSrc = false)
    {
        if (file_exists($zipFilename)) {
            @unlink($zipFilename);
        }
        $za = new ZipArchive();
        if ($za->open($zipFilename, ZipArchive::CREATE)) {
            if (!is_array($srcFilenames)) {
                $za->addFile($srcFilenames, basename($srcFilenames));
                $za->close();
                if (!!$removeSrc) {
                    @unlink($srcFilenames);
                }
            } else {
                foreach ($srcFilenames as $filename) {
                    $za->addFile($filename, basename($filename));
                }
            }
            if (self::$_ADD_COMMENT) {
                $za->setArchiveComment(self::$_COMMENT);
            }
            $za->close();
            if ($removeSrc) {
                foreach ($srcFilenames as $filename) {
                    @unlink($filename);
                }
            }
        }
    }

    /**
     * 压缩文件夹(只能压缩本级目录下的文件)
     * @param string $zipFilename 输出的压缩文件名
     * @param string $folder 源文件目录
     * @param string $pattern 匹配的文件(不指定则选取所有文件)
     * @param bool   $removeSrc true=删除被压缩的文件
     */
    static function compressFolder($zipFilename, $folder, $pattern = '*', $removeSrc = false)
    {
        if (!class_exists('ZipArchive')) {
            throw new Exception('class ZipArchive not available.');
        }
        $folder .= '/' !== substr($folder, -1, 1) ? '/' : '';
        $files  = glob($folder . $pattern);
        if (file_exists($zipFilename)) {
            // 删除原压缩文件
            unlink($zipFilename);
        }
        if (self::$_DATETIME_FORMAT) {
            // 增加日期时间戳
            $zipFilename = pathinfo($zipFilename, PATHINFO_FILENAME) . '_' . date(self::$_DATETIME_FORMAT) . '.' . pathinfo($zipFilename, PATHINFO_EXTENSION);
        }
        $za = new ZipArchive();
        if ($za->open($folder . basename($zipFilename), ZipArchive::CREATE)) {
            foreach ($files as $filename) {
                $za->addFile($filename, basename($filename));
                if (!!$removeSrc) {
                    // 移除原文件
                    unlink($filename);
                }
            }
            if (self::$_ADD_COMMENT) {
                $za->setArchiveComment(self::$_COMMENT);
            }
            return $za->close();
        }
        return false;
    }
}

你可能感兴趣的:(PHP文件工具类)