0

我从以前的帖子中找到了下面的脚本来使用 PHP 创建一个 ZIP 文件。

此脚本允许您创建一个 zip 文件,但它不允许您在任何您想要的目录中创建它。这是原始代码。

    <?php
    // Config Vars 

    $sourcefolder =   "uploads/output" ; // Default: "./" 
    $zipfilename  = "myarchive.zip"; // Default: "myarchive.zip"
    $timeout      = 5000           ; // Default: 5000

    // instantate an iterator (before creating the zip archive, just
    // in case the zip file is created inside the source folder)
    // and traverse the directory to get the file list.
    $dirlist = new RecursiveDirectoryIterator($sourcefolder);
    $filelist = new RecursiveIteratorIterator($dirlist);

    // set script timeout value 
    ini_set('max_execution_time', $timeout);

    // instantate object
    $zip = new ZipArchive();

    // create and open the archive 
    if ($zip->open("$zipfilename", ZipArchive::CREATE) !== TRUE) {
        die ("Could not open archive");
    }

    // add each file in the file list to the archive
    foreach ($filelist as $key=>$value) {
        $zip->addFile(realpath($key), $key) or die ("ERROR: Could not add file: $key");
    }

    // close the archive
    $zip->close();
    echo "<br>Archive ". $zipfilename . " created successfully - ";

    // And provide download link ?>
    <a href="http:<?php echo $zipfilename;?>" target="_blank">Download <?php echo $zipfilename?></a> 

我尝试修改代码以便能够决定脚本的目标,因为在互联网上花费了几个小时后我没有找到解决方案。一些解决方案建议在哪里更改 $zipfilename = "myarchive.zip"; 到 $zipfilename = "上传/输出/myarchive.zip"; 但在下载链接的 URL 中,我希望显示为:存档 myarchive.zip 创建成功 - 下载 myarchive.zip不作为存档上传/输出/myarchive.zip 创建成功 - 下载 myarchive.zip

因此我尝试了这段代码,但它对我不起作用。我不知道我做错了什么。

<?php
// Config Vars 

$sourcefolder =   "uploads/output" ; // Default: "./" 
$destfolder  = "uploads/output/"; // Default: "myarchive.zip"
$zipfilename  = "myarchive.zip"; // Default: "myarchive.zip"
$timeout      = 5000           ; // Default: 5000

// instantate an iterator (before creating the zip archive, just
// in case the zip file is created inside the source folder)
// and traverse the directory to get the file list.
$dirlist = new RecursiveDirectoryIterator($sourcefolder);
$filelist = new RecursiveIteratorIterator($dirlist);

// set script timeout value 
ini_set('max_execution_time', $timeout);

// instantate object
$zip = new ZipArchive();

// create and open the archive 
if ($zip->open(''.$destfolder.''.$zipfilename.'', ZipArchive::CREATE) !== TRUE) {
    die ("Could not open archive");
}

// add each file in the file list to the archive
foreach ($filelist as $key=>$value) {
    $zip->addFile(realpath($key), $key) or die ("ERROR: Could not add file: $key");
}

// close the archive
$zip->close();
echo "<br>Archive ". $zipfilename . " created successfully - ";

// And provide download link ?>
<a href="http:<?php echo $zipfilename;?>" target="_blank">Download <?php echo $zipfilename?></a> 
4

1 回答 1

0

创建 zip 存档的示例静态方法:

//...
public static function zip($source, $destination)
{
    if (!extension_loaded('zip') || !file_exists($source)) {
        throw new \Exception('zip not loaded');
    }

    $zip = new \ZipArchive();
    if ($zip->open($destination, \ZIPARCHIVE::CREATE) === false) {
        return false;
    }

    if (is_dir($source) === true) {
        $files = new \RecursiveIteratorIterator(
            new \RecursiveDirectoryIterator($source),
            \RecursiveIteratorIterator::SELF_FIRST
        );

        foreach ($files as $file) {
            if (in_array(substr($file, strrpos($file, DIRECTORY_SEPARATOR) + 1), array('.', '..'))) {
                continue;
            }
            $file = realpath($file);
            if (is_dir($file) === true) {
                $zip->addEmptyDir(str_replace($source . DIRECTORY_SEPARATOR, '', $file . DIRECTORY_SEPARATOR));
            } else {
                if (is_file($file) === true) {
                    $zip->addFromString(
                        str_replace($source . DIRECTORY_SEPARATOR, '', $file),
                        file_get_contents($file)
                    );
                }
            }
        }
    } else {
        if (is_file($source) === true) {
            $zip->addFromString(basename($source), file_get_contents($source));
        }
    }

    return $zip->close();
}
// ...
于 2013-03-16T02:06:22.703 回答