php 创建没有 zip 内文件路径的 zip

2022-08-30 09:22:59

我正在尝试使用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');

答案 1

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

根据文档

bool ZipArchive::addFile ( string $filename [, string $localname ] )

文件名
要添加的文件的路径。

ZIP 存档中的
本地名称本地名称。

这意味着第一个参数是文件系统中实际文件的路径,第二个参数是文件在存档中将具有的路径和文件名。

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

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

答案 2

我认为更好的选择是:

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

它只是从路径中提取文件名。


推荐