TP下载文件夹,压缩文件夹并下载

这篇博客介绍了如何在PHP中实现文件夹压缩并提供下载的功能。通过使用ZipArchive类,首先将文件夹内容压缩成ZIP文件,然后利用HTTP头信息触发浏览器下载。此外,还提供了下载文件的实现,包括文件路径处理、文件存在性检查以及文件内容的读取和输出。这个方法适用于TP6框架,但未明确验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TP下载文件夹,压缩文件夹并下载


一个文件夹是无法直接下载的,需要先把要下载的文件夹压缩,然后再将已经压缩好的文件下载到浏览器

/**
 * 封装压缩文件
 * @param $name
 */
public function zipFile($name){
    $zip = new \ZipArchive();
    
	// 需要压缩的文件路劲
    $file_name = ROOT_PATH.'public'.DS.'uploads'.DS.$name;

    //压缩文件名
    $filename = 'uploads/download';

    if ($zip->open($filename, \ZipArchive::CREATE | \ZipArchive::OVERWRITE) === TRUE) {
        if (file_exists($file_name)) {
            Zip::addFileToZip($file_name, $zip);//执行递归压缩目录的操作
        } else {
            throw new NotFoundHttpException('该目录不存在或被删除');
        }
    }

    //打包zip
    $zip->close();
}

封装zip类,也可以用作方法

class Zip extends Controller
{
    public static function addFileToZip($path, &$zip,$root='')
    {
        $handler = opendir($path); //打开当前文件夹由$path指定。
        !$root && $root = $path;

        while (($filename = readdir($handler)) !== false)
        {
            if ($filename != "." && $filename != "..")
            {//文件夹文件名字为'.'和‘..’,不要对他们进行操作
                if (is_dir($path . "/" . $filename))
                {// 如果读取的某个对象是文件夹,则递归
                    self::addFileToZip($path . "/" . $filename, $zip, $root);
                }
                else
                { //将文件加入zip对象
                    $pathFilename=$path . "/" . $filename;
                    $zip->addFile($pathFilename, str_replace($root.'/','',$pathFilename));
                }
            }
        }
        @closedir($path);
    }

}
/**
  * 封装下载excel
  */
 public function head_upload($file_name)
 {
     $file_name = iconv("utf-8", "gbk//IGNORE", $file_name);;  //中文表名转码
     $file_dir = $_SERVER['DOCUMENT_ROOT']."/excel_template/";        //下载文件存放目录
     //检查文件是否存在
     if (!file_exists($file_dir . $file_name)) {
         header('HTTP/1.1 404 NOT FOUND');
     } else {
         //以只读和二进制模式打开文件
         $file = fopen($file_dir . $file_name, "rb");

         //告诉浏览器这是一个文件流格式的文件
         Header("Content-type: application/octet-stream");
         //请求范围的度量单位
         Header("Accept-Ranges: bytes");
         //Content-Length是指定包含于请求或响应中数据的字节长度
         Header("Accept-Length: " . filesize($file_dir . $file_name));
         //用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。
         Header("Content-Disposition: attachment; filename=" . $file_name);

         //读取文件内容并直接输出到浏览器
         echo fread($file, filesize($file_dir . $file_name));
         fclose($file);
         exit ();
     }
 }

注意:文件夹的路劲,根据个人项目来定,下载文件的方法tp6也可以,压缩文件的方法,tp6没试过,调试一下应该都没问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故蓝寻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值