PHP zip 打包并下载

1,Zipper

composer 中的zip压缩包,参考: https://packagist.org/packages/chumper/zipper

1,安装

Laravel 5: composer require chumper/zipper: “1.0.x”
Laravel 4: composer require chumper/zipper: “0.5.x”

修改 app/config/app.php
在providers加上:

Chumper\Zipper\ZipperServiceProvider::class

在aliases加上:

 'Zipper' => Chumper\Zipper\Zipper::class

也可以不在app.php中加面板。
直接实例化也行。

$zipper = new \Chumper\Zipper\Zipper;

2,实例

<?php
$zipper = new \Chumper\Zipper\Zipper;
$filesDir = '要压缩的文件夹完整路径';//这里也可以是单个文件
$dir = '保存路径';
$filename = '保存文件名';

Zipper::make($dir . DIRECTORY_SEPARATOR  . $filename)->add($filesDir)->close();
?>

3,功能

1,make($pathToFile) 或 zip($pathToFile)

创建或打开一个zip 文档,如果 $pathToFile 不存在,则新创建一个zip 文档,如果 $pathToFile 存在,则打开这个文档(如果打开这个文档不可读,会报错, 它没判断这个文件是否是zip格式的,用的时候还是要注意)。
源码:

public function make($pathToFile, $type = 'zip')
    {
        $new = $this->createArchiveFile($pathToFile);
        $this->filePath = $pathToFile;

        $objectOrName = $type;
        if (is_string($type)) {
            $objectOrName = 'Chumper\Zipper\Repositories\\'.ucwords($type).'Repository';
        }

        if (!is_subclass_of($objectOrName, 'Chumper\Zipper\Repositories\RepositoryInterface')) {
            throw new \InvalidArgumentException("Class for '{$objectOrName}' must implement RepositoryInterface interface");
        }

        $this->repository = $type;
        if (is_string($objectOrName)) {
            $this->repository = new $objectOrName($pathToFile, $new);
        }

        return $this;
    }

从源码中可以看到,作者想支持更多的压缩方式, 现在只能是zip,考虑到跨平台的事,还是不好解决的。

我们在用的时候 , make 和 zip 方法是没有区别的。
源码中有两个函数:

public function phar($pathToFile)
public function rar($pathToFile)

这两个现在这个版本还是不支持的,希望作者能实现。

2,add($files/folder)

添加要压缩的对象,可以是单个文件、文件数组或是路径,很方便。添加单个文件时可以加第二个参数, 重写命名添加的文件名。
源码:

 public function add($pathToAdd, $fileName = null)
    {
        if (is_array($pathToAdd)) {
            foreach ($pathToAdd as $key=>$dir) {
                if (!is_int($key)) {
                    $this->add($dir, $key); }
                else {
                    $this->add($dir);
                }
            }
        } elseif ($this->file->isFile($pathToAdd)) {
            if ($fileName) {
                $this->addFile($pathToAdd, $fileName);
            } else {
                $this->addFile($pathToAdd);
            }
        } else {
            $this->addDir($pathToAdd);
        }

        return $this;
    }

3,addString($filename, $content)

添加一个内容字符串到压缩文档中, 这个功能对于文件在远程存储特别有用,不用下载到本地,直接file_get_content读出来添加就行。

4,remove($file/s)

从压缩包中删除一个文件($file)或是文件数组($files)

5,folder($folder)

在压缩包里指定文件夹,添加或删除一个文件。

Zipper::make('test.zip')->folder('test')->add('composer.json');//往test.zip压缩包中的test文件夹中添加一个 composer.json 文件。
Zipper::make('test.zip')->folder('test')->remove('composer.json');
//从test.zip压缩包中的test文件夹中删除一个 composer.json 文件。

5,listFiles($regexFilter = null)

列出压缩包中的文件,$regexFilter 正则过滤条件。
如果$regexFilter 未Null 则是全部文件

$logFiles = Zipper::make('test.zip')->listFiles('/\.log$/i'); //列出 以.log 结尾的文件
$notLogFiles = Zipper::make('test.zip')->listFiles('/^(?!.*\.log).*$/i'); //列出包含 .log的文件;例如:xxx.log.txt

6,home()

Resets the folder pointer.

public function home()
    {
        $this->currentFolder = '';

        return $this;
    }

7,getFileContent($filePath)

从压缩包中获取指定文件的内容;如果文件存在返回内容(string类型的), 没有则返回 false

7,getStatus()

返回打开的压缩包的状态。(也没用过)

8,close()

这个很重要, 对压缩包操作完,一定要close。

9,extractTo($path)

从压缩包中提出文件到指定的文件夹下。

 $path = storage_path('app') . '/foo';
 Zipper::make('test.zip')->folder('test')->extractTo($path);
 //从test.zip提取 text文件夹下的所有文件到 $path 目录下

*Zipper::WHITELIST(白名单)

 Zipper::make('test.zip')->extractTo('public', array('vendor'), Zipper::WHITELIST);
 //从test.zip中提出 vendor目录的所有文件到 public 下。Zipper::WHITELIST 是白名单

*Zipper::BLACKLIST 黑名单

 Zipper::make('test.zip')->extractTo('public', array('vendor'), Zipper::BLACKLIST);
 //从test.zip中提出除 vendor目录,其他所有文件到 public 下

*Zipper::EXACT_MATCH 精准匹配

 Zipper::make('test.zip')
    ->folder('vendor')
    ->extractTo('public', array('composer', 'bin/phpunit'), Zipper::WHITELIST | Zipper::EXACT_MATCH);

//匹配 composer的文件和bin/phpunit 文件

注:官网说是文件或文件夹,实测只能是文件。

*extractMatchingRegex($path, $regex) 正则匹配

Zipper::make('test.zip')->folder->('src')->extractMatchingRegex($path, '/\.php$/i');

2,下载

<?php
        $downloadName = date('Y-m-d') . '.zip';
        header('Content-Type:application/zip');
        header('Content-disposition: attachment; filename='.$downloadName);
        header('Content-Length: ' . filesize($zipname));
        readfile($zipname);
?>

注:输出时不要echo 其他内容。


ph.w
ph.w 1年前

已被 0 人挖起

回应
登录 后发表评论
  • 消灭零回应