php压缩文件zip格式并打包(单个或多个文件压缩)

时间:2024-03-02 20:52:34

最近接到一个需求,就是选择多个文件下载时,不要一个一个下载,直接把多个文件打包成一个文件进行下载。我们项目是前后端分离,所以我写了个接口,让前端传参数,后台下载。

废话不多说,直接上代码:

先是压缩单个文件的:

$zip = new ZipArchive;
$zip_time = time().".zip"; // 压缩的目录名
$zip_filename = $zip_time; // 指定一个压缩包地址

$zip->open($zip_filename, ZIPARCHIVE::CREATE); // 打开压缩包,没有则创建

// 参数1是要压缩的文件,参数2为压缩后,在压缩包中的文件名
//如果需要的压缩后的文件跟原文件名一样 addFile() 的第二个参数可以改为 basename("../alg/demo1.php"),也就是原文件所在的路径
$zip->addFile("log.txt",basename("log.txt"));
$rs = $zip->close();
var_dump($rs);

  

多个文件下载打包成一个文件的:

<?php

function zipfile($file_path)
{
    // 压缩多个文件
    $fileList = explode(\',\', $file_path);
    $filename = time() . ".zip"; // 压缩包所在的位置路径
    $zip = new ZipArchive();
    $zip->open($filename, ZipArchive::CREATE);   //打开压缩包
    foreach ($fileList as $file) {
        $zip->addFile($file, basename($file));   //向压缩包中添加文件
    }
    $rs = $zip->close();  //关闭压缩包

    //下载文件
    $file = fopen($filename, "r");
    //返回的文件类型
    Header("Content-type: application/octet-stream");
    //按照字节大小返回
    Header("Accept-Ranges: bytes");
    //返回文件的大小
    Header("Accept-Length: " . filesize($filename));
    //这里设置客户端的弹出对话框显示的文件名
    Header("Content-Disposition: attachment; filename=" . $filename);
    //一次性将数据传输给客户端
    //echo fread($file, filesize($filePath));
    //一次只传输1024个字节的数据给客户端
    //向客户端回送数据
    $buffer = 1024;//
    //判断文件是否读完
    while (!feof($file)) {
        //将文件读入内存
        $file_data = fread($file, $buffer);
        //每次向客户端回送1024个字节的数据
        echo $file_data;

    }
    //将生成的zip文件在服务器端删除,只需要客户端下载就行了
    @unlink($filename);

}

zipfile(\'D:\phpstudy_pro\WWW\log.txt,D:\phpstudy_pro\WWW\index.html\');
前端传的参数是以逗号分隔传给我的路劲。