如何在php中只压缩某些扩展名的文件? (.pdf,.mp3和.zip)

时间:2015-08-07 10:36:13

标签: php

我一直试图只压缩.pdf,.mp3& .zip目录中的文件,但它压缩所有目录和文件。我只想要具有上述扩展名的文件。

如果这不可能发生,那么我想排除一些文件,比如我要排除index.php,foo.html,style.css&的script.js。

function Zip($source, $destination)
{
    if (!extension_loaded('zip') || !file_exists($source)) {
        return false;
    }

    $zip = new ZipArchive();
    if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
        return false;
    }

    $source = str_replace('\\', '/', realpath($source));

    if (is_dir($source) === true)
    {
        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

        $exclude = array('themes', 'style.css');

        foreach ($files as $file)
        {
            $file = str_replace('\\', '/', $file);

            if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) )
                continue;

            if (!in_array($file, $exclude)) {

                $file = realpath($file);

                if (is_dir($file) === true)
                {
                    $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
                }
                else if (is_file($file) === true)
                {
                    $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
                }
            }
        }
    }
    else if (is_file($source) === true)
    {
        $zip->addFromString(basename($source), file_get_contents($source));
    }

    return $zip->close();
}

请帮帮我,谢谢!

2 个答案:

答案 0 :(得分:1)

列出要排除/包含在变量中的所有扩展名。 然后检查每个苍蝇扩展并跳过它们是否在上面的列表中。可以使用in_array完成,如上面所示的Debflav'。

请使用以下函数获取文件扩展名:

/**
 * Get file extension type if we provide the filename. 
 * @param string $filename eg. 'filename.jpg'
 * 
 * @return string Extension only eg. "jpg", 'gif'
 */
function _get_file_extension($filename=null)
{
    $e = explode('.', $filename);

    $extension = (count($e) > 0 ) ? $e[ ( count($e) - 1) ] : null;

    return strtolower($extension);
}

希望有所帮助!

答案 1 :(得分:0)

正如我在评论中所说,您只能处理扩展名为mp3,pdf [...]的文件。因为您使用了RecursiveDirectoryIterator我将执行以下操作:

if (is_dir($source) === true)
{
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

    $allowedExtensions = array('mp3', 'pdf');

    foreach ($files as $file) {
    {
        if (in_array($file->getExtension(), $allowExtensions)
        {
            // Your own logic
        }
    }
}

顺便说一句,DirectoryIterator自PHP 5起可用,但自PHP 5.3.6起可用getExtension()。如果您使用的是PHP< 5.3.6您可以使用pathinfo()