php在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; }

我正在尝试使用php创建一个zip文件(它确实创建了一个zip文件,这是从本页中获取的),但是在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');

这里的问题是,
$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函数,我同意,这更有意义