PHP创buildzip文件,而无需path文件

我试图使用PHP来创build一个zip文件(它从 – 这个页面 – http://davidwalsh.name/create-zip-php ),但是在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'); 

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

根据文件 :

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

文件名
要添加的文件的path。

的localName
ZIP归档中的本地名称。

这意味着第一个参数是文件系统中实际文件的path,第二个参数是文件在归档中的path和文件名。

当你提供第二个参数的时候,你需要在将它添加到zip压缩文件时去掉它的path。 例如,在基于Unix的系统上,这看起来像:

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

我认为更好的select是:

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

它只是从path中提取文件名。

这只是我发现为我工作的另一种方法

 $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);