How to compress files and directories in php

2
Hello, I need to compress files and folders together, for example, I have a folder named teste and it has several files and subfolders (with more subfolders inside) , and would like to pack all of this with php.

So far I only have this code, but it compacts the entire path and not just where I indicated it, for example, if I indicate to it to compact teste/teste1/ it will not compress what is inside teste1 and yes the path integer from teste .

    $directory = DIR_ARQUIVOS.'yNPA8Bg0GFLV';

$zipfile = DIR_ARQUIVOS.'yNPA8Bg0GFLV.zip';

$filenames = array();

function browse($dir) 
{
    global $filenames;
    if ($handle = opendir($dir)) 
    {
        while (false !== ($file = readdir($handle))) 
        {

            if($file != "." && $file != ".." && is_file($dir.'/'.$file) && $dir != './arquivos/yNPA8Bg0GFLV') 
            {
                echo $dir. "<br/>";
                $filenames[] = $dir.'/'.$file;
            }
            else if ($file != "." && $file != ".." && is_dir($dir.'/'.$file)) 
            {
                browse($dir.'/'.$file);
            }
        }
        closedir($handle);
    }
    return $filenames;
}

browse($directory);

$zip = new ZipArchive();

if ($zip->open($zipfile, ZIPARCHIVE::CREATE)!== TRUE){exit("cannot open <$zipfile>\n");}

foreach ($filenames as $filename) 
{
    echo "Adding " . $filename . "<br/>";
    $zip->addFile($filename,$filename);
}

$zip->close();
    
asked by anonymous 23.03.2017 / 15:36

1 answer

1

The function below is a bit old but works fine.

The description of what the script does is in the code comments.

function Compress($source_path)
{
    // Normaliza o caminho do diretório a ser compactado
    $source_path = realpath($source_path);

    // Caminho com nome completo do arquivo compactado
    // Nesse exemplo, será criado no mesmo diretório de onde está executando o script
    $zip_file = __DIR__.'/'.basename($source_path).'.zip';

    // Inicializa o objeto ZipArchive
    $zip = new ZipArchive();
    $zip->open($zip_file, ZipArchive::CREATE | ZipArchive::OVERWRITE);

    // Iterador de diretório recursivo
    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($source_path),
        RecursiveIteratorIterator::LEAVES_ONLY
    );

    foreach ($files as $name => $file) {
        // Pula os diretórios. O motivo é que serão inclusos automaticamente
        if (!$file->isDir()) {
            // Obtém o caminho normalizado da iteração corrente
            $file_path = $file->getRealPath();

            // Obtém o caminho relativo do mesmo.
            $relative_path = substr($file_path, strlen($source_path) + 1);

            // Adiciona-o ao objeto para compressão
            $zip->addFile($file_path, $relative_path);
        }
    }

    // Fecha o objeto. Necessário para gerar o arquivo zip final.
    $zip->close();

    // Retorna o caminho completo do arquivo gerado
    return $zip_file;
}

// O diretório a ser compactado
$source_path = '/folder/folder/';
echo Compress($source_path);
    
23.03.2017 / 17:09