我正在尝试使用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');
答案 0 :(得分:120)
这里的问题是$zip->addFile
传递了相同的两个参数。
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();
}