php在zip中创建没有文件路径的zip
我正在尝试使用php创建一个zip文件(它确实创建了一个zip文件,这是从本页中获取的),但是在zip文件中有文件本身的所有文件夹名称 是否可以将文件放在zip中减去所有文件夹 这是我的密码:php在zip中创建没有文件路径的zip,php,zip,directory,Php,Zip,Directory,我正在尝试使用php创建一个zip文件(它确实创建了一个zip文件,这是从本页中获取的),但是在zip文件中有文件本身的所有文件夹名称 是否可以将文件放在zip中减去所有文件夹 这是我的密码: function create_zip($files = array(), $destination = '', $overwrite = true) { if(file_exists($destination) && !$overwrite) { return false; }
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(字符串$filename[,字符串$localname])
文件名要添加的文件的路径 localname
ZIP存档中的本地名称 这意味着第一个参数是文件系统中实际文件的路径,第二个参数是文件在归档文件中的路径和文件名 当您提供第二个参数时,在将其添加到zip归档文件时,您将希望从中删除路径。例如,在基于Unix的系统上,这看起来像:
$new_filename = substr($file,strrpos($file,'/') + 1);
$zip->addFile($file,$new_filename);
我认为更好的选择是:
$zip->addFile($file,basename($file));
它只是从路径中提取文件名。这只是我发现的另一种适合我的方法
$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);
我使用它从zip中删除根文件夹
D:\xampp\htdocs\myapp\assets\index.php
我会准时到达:
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();
}
echo$main\u path=str\u replace(“\\”、“/”、\uuuuu DIR\uuuuuuuuuuuuuuuuu);//获取当前文件夹,该文件夹称为scipt
$zip_file='myapp.zip';
如果(文件存在($main_路径)&&is_目录($main_路径))
{
$zip=新的ZipArchive();
如果(文件存在($zip文件)){
取消链接($zip_文件);//截断zip
}
如果($zip->open($zip_文件,ZIPARCHIVE::CREATE)!==TRUE){
模具(“无法打开”);
}
$files=0;
$path=数组($main_path);
while(list(,$path)=每个($path))
{
foreach(全局($path./*')作为$p)
{
if(is_dir($p)){
$path[]=$p;
}否则{
//这里的特别之处:我们删除根文件夹(“D:\xampp\htdocs\myapp\”):D
$new\u filename=str\u replace($main\u path.“/”,“”,$p);
$zip->addFile($p,$new\u文件名);
$files++;
echo$p.“
\n”;
}
}
}
回显“总文件数:”.$files;
$zip->close();
}
试试-D
开关(大写!)奇怪的是,这个相同的问题在两天内出现了两次。。。哈哈,流行的问题?奇怪,谢谢内森,5年后仍然有用。之所以会出现这种情况,是因为我们都从非常流行的David Walsh:中获取了相同的ZipArchive脚本,其中包含以下问题:)出于某种原因,当我这样做时,我会在ZIP文件的底部和嵌套目录结构中获取文件,这基本上会导致所有文件都位于ZIP存档的两倍和两倍大小。还有谁有这个问题并找到了解决办法?谢谢。@HartleySan,这是因为ZIP是以前创建的,现在正在打开,以便使用没有路径的新文件进行扩展。试着先删除ZIP文件,你不会同时得到包含路径和不包含路径的文件。我不知道有一个内置的PHP函数,我同意,这更有意义