php创建拉链没有路径到zip文件的路径

时间:2010-10-22 00:43:45

标签: php zip directory

我正在尝试使用php创建一个zip文件(它可以从这个页面中获取 - http://davidwalsh.name/create-zip-php),但是在zip文件中是文件本身的所有文件夹名称。

是否可以让zip文件中的文件减去所有文件夹?

这是我的代码:

function create_zip($files = array(), $destination = '', $overwrite = true) {

    if(file_exists($destination) && !$overwrite) { return false; };
    $valid_files = array();
    if(is_array($files)) {
        foreach($files as $file) { 
            if(file_exists($file)) { 
                $valid_files[] = $file;
            };
        };
    };
    if(count($valid_files)) { 
        $zip = new ZipArchive();
        if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) { 
            return false;
        };
        foreach($valid_files as $file) { 
            $zip->addFile($file,$file);
        };
        $zip->close();
        return file_exists($destination);
    } else {
        return false;
    };

};


$files_to_zip = array('/media/138/file_01.jpg','/media/138/file_01.jpg','/media/138/file_01.jpg');

$result = create_zip($files_to_zip,'/...full_site_path.../downloads/138/138_files.zip');

4 个答案:

答案 0 :(得分:120)

这里的问题是$zip->addFile传递了相同的两个参数。

根据the documentation

  

bool ZipArchive :: addFile (字符串 $ filename [,字符串 $ localname ])

     

<强>文件名
  要添加的文件的路径。

     

<强>的localName
  ZIP存档中的本地名称。

这意味着第一个参数是文件系统中实际文件的路径,第二个参数是路径&amp;文件在档案中的文件名。

当您提供第二个参数时,您需要在将其添加到zip存档时从中删除路径。例如,在基于Unix的系统上,这看起来像:

$new_filename = substr($file,strrpos($file,'/') + 1);
$zip->addFile($file,$new_filename);

答案 1 :(得分:40)

我认为更好的选择是:

$zip->addFile($file,basename($file));

只需从路径中提取文件名。

答案 2 :(得分:0)

这只是我发现的另一种方法,对我有用

$zipname = 'file.zip';
$zip = new ZipArchive();
$tmp_file = tempnam('.','');
$zip->open($tmp_file, ZipArchive::CREATE);
$download_file = file_get_contents($file);
$zip->addFromString(basename($file),$download_file);
$zip->close();
header('Content-disposition: attachment; filename='.$zipname);
header('Content-type: application/zip');
readfile($tmp_file);

答案 3 :(得分:0)

我用它从 zip 中删除根文件夹

D:\xampp\htdocs\myapp\assets\index.php

将在 zip 中:

assets\index.php

我们的代码:

echo $main_path = str_replace("\\", "/", __DIR__ );// get current folder, which call scipt
$zip_file = 'myapp.zip';

if (file_exists($main_path) && is_dir($main_path))  
{
    $zip = new ZipArchive();

    if (file_exists($zip_file)) {
        unlink($zip_file); // truncate ZIP
    }
    if ($zip->open($zip_file, ZIPARCHIVE::CREATE)!==TRUE) {
        die("cannot open <$zip_file>\n");
    }

    $files = 0;
    $paths = array($main_path);
    while (list(, $path) = each($paths))
    {
        foreach (glob($path.'/*') as $p)
        {
            if (is_dir($p)) {
                $paths[] = $p;
            } else {
                // special here: we remove root folder ("D:\xampp\htdocs\myapp\") :D
                $new_filename = str_replace($main_path."/" , "", $p);
                $zip->addFile($p, $new_filename);
                $files++;

                echo $p."<br>\n";
            }
        }
    }

    echo 'Total files: '.$files;

    $zip->close();
}