0

每次我从 PHP 创建 zip 文件时,都会有一个空文件夹“\data”。但是服务器中没有这样的文件夹。当我解压缩 zip 文件并浏览该空文件夹时,它显示的路径如下:

\data/www/subdomains/site/httpdocs/

它看起来像我要压缩的文件夹的绝对路径。

这是我的代码:

<?php 

$file = tempnam("tmp","zip");
zip_directory($_GET['catname'].'/'.$_GET['directtozip'].'/',$file);

header('Content-Type: application/zip');
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename="'.$_GET['directtozip'].'.zip"');

readfile($file);
unlink($file); 

function zip_directory($source,$tempfile){
if(!extension_loaded('zip') || !file_exists($source)) return false;
$zip = new ZipArchive();
if(!$zip->open($tempfile,ZIPARCHIVE::CREATE)) return false;
$source = str_replace('\\','/',realpath($source));
if(is_dir($source) === true){
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source),         RecursiveIteratorIterator::SELF_FIRST);
    foreach($files as $file){


    // Excluded folders or file from zip.
    $chk_1 = strstr($file,$source .'/'.'.svn');

    if($chk_1){continue;}

     $file = str_replace('\\', '/', realpath($file));

        if (is_dir($file) === true)
        {
            $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
        }
        else if (is_file($file) === true)
        {
            $zip->addFromString(str_replace($source . '/', '', $file),     file_get_contents($file));
        }
    }
}
elseif(is_file($source) === true) $zip->addFromString(basename($source),     file_get_contents($source));

return $zip->close();
}

zip_directory($source,$tempfile);

?>

提前致谢。

4

1 回答 1

0

最后一行是什么,zip_directory($source,$tempfile);因为 $tempfile 没有定义。

你的代码对我来说没问题

<?php 

$file = tempnam("tmp","zip");

zip_directory('__z/', $file);

header('Content-Type: application/zip');
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename="_zzz.zip"');

readfile($file);
unlink($file); 

function zip_directory($source, $tempfile){
    if(!extension_loaded('zip') || !file_exists($source)) {
        return false;
    }
    $zip = new ZipArchive();
    if(!$zip->open($tempfile, ZIPARCHIVE::CREATE)) {
        return false;
    }
    $source = str_replace('\\','/', realpath($source));
    if( is_dir($source) === true ) {
        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);
        foreach($files as $file){
            $chk_1 = strstr($file,$source .'/'.'.svn');
            if($chk_1){continue;}
            $file = str_replace('\\', '/', realpath($file));
            if (is_dir($file) === true) {
                $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
            } else if (is_file($file) === true) {
                $zip->addFromString(str_replace($source . '/', '', $file),     file_get_contents($file));
            }
        }
    } elseif( is_file($source) === true ) {
        $zip->addFromString(basename($source), file_get_contents($source));
    }
    return $zip->close();
}

?>
于 2012-11-29T09:58:42.857 回答