php 文件操作类

86 阅读1分钟

参考代码为tp5 类放在extend里,命名空间看情况,本人是放在一个crepdf的文件夹里的

<?php
namespace crepdf;

use think\Request;

class FileOption
{
    //创建压缩文件
    public function create_zip($path, $filename)
    {
        $zip = new \ZipArchive();
        if ($zip->open($filename . '.zip', \ZipArchive::CREATE | \ZipArchive::OVERWRITE)) {
            $this->addFileToZip($path, $zip); //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
            $zip->close(); //关闭处理的zip文件
        }
    }
    //添加压缩文件
    public function addFileToZip($path, $zip)
    {
        $handler = opendir($path); //打开当前文件夹由$path指定。
        while (($filename = readdir($handler)) !== false) {
            if ($filename != "." && $filename != "..") { //文件夹文件名字为'.'和‘..’,不要对他们进行操作
                if (is_dir($path . "/" . $filename)) {
                    $this->addFileToZip($path . "/" . $filename, $zip);
                } else {
                    $zip->addFile($path . "/" . $filename);
                }
            }
        }
        @closedir($path);
    }
    /**
     * @param $path 要下载的文件路径
     */
      public function download($path)
    {
        if (!file_exists('.' . $path)) {
            exit('文件不存在或已经删除');
        };
        $request = Request::instance();
        $domain = $request->domain();   //当前域名
        $file = $domain . $path;    //图片完整路径
        $fileTmp = pathinfo($file);
        $fileExt = $fileTmp['extension'];    //图片后缀名
        $filename = time() . mt_rand(99, 999);   //图片名称,可以任务设置图片名称
        $saveFileName = ($filename . '.' . $fileExt);
        $fp = fopen($file, "r");
        //下载文件需要用到的头
        Header("Content-type: application/octet-stream");
        Header("Accept-Ranges: bytes");
        Header("Content-Disposition: attachment; filename=" . $saveFileName);
        $buffer = 1024;
        $file_count = 0;
        //向浏览器返回数据
        while (!feof($fp)) {
            $file_con = fread($fp, $buffer);
            $file_count += $buffer;
            echo $file_con;
        }
        fclose($fp);
        unlink('.' . $path);
    }

    //删除文件夹以及下面所有文件
    public static function deleteDir($dir)
    {
        if (!$handle = @opendir($dir)) {
            return false;
        }
        while (false !== ($file = readdir($handle))) {
            if ($file !== "." && $file !== "..") {       //排除当前目录与父级目录
                $file = $dir . '/' . $file;
                if (is_dir($file)) {
                    self::deleteDir($file);
                } else {
                    @unlink($file);
                }
            }
        }
        @rmdir($dir);
    }
    
    //将文件添加到压缩文件夹并下载
    public static function downloadZip($files)
    {
         $zip = new \ZipArchive();
        // ZIP文件的名称
        $zipFileName = __DIR__ .  "发票$id-" . time() . mt_rand(99, 9999) . ".zip";
        // 打开ZIP文件进行创建,如果文件存在则覆盖
        if ($zip->open($zipFileName, \ZipArchive::CREATE | \ZipArchive::OVERWRITE) === TRUE) {
            // 遍历图片数组,将图片添加到ZIP文件
            foreach ($files as $image) {
                // 添加文件到zip,参数1:存储在zip中的文件名,参数2:要压缩的文件路径
                $res = $zip->addFile('.' . $image, basename($image));
            }
            // 关闭ZIP文件
            $zip->close();

            // 设置HTTP头部进行下载
            header('Content-Type: application/zip');
            header('Content-Disposition: attachment; filename="' . basename($zipFileName) . '"');
            header('Content-Length: ' . filesize($zipFileName));
            // 清除缓冲区并关闭输出缓冲
            ob_clean();
            flush();
            // 读取ZIP文件并删除服务器上的ZIP文件
            readfile($zipFileName);
            unlink($zipFileName);
        } else {
            echo '无法创建ZIP文件';
        }
    }
}

调用

$folder =time() . mt_rand(99, 9999);//文件名
$fileOption = new FileOption();
$path = './' . $folder;
$fileOption->create_zip($path, $path);
$fileOption->download($path);
$fileOption->deleteDir($path);