Laravel PHP 创建空的新 zip 存档 [重复]

Laravel PHP create empty new zip archive [duplicate]

提问人:Paul Godard 提问时间:8/3/2023 最后编辑:hakrePaul Godard 更新时间:8/3/2023 访问量:58

问:

我不明白为什么每次运行以下脚本时,zip 文件都会包含所有以前的文件。

每次运行脚本时,我都想从一个空存档开始。我该怎么做?

我尝试添加一个空文件夹,但这无济于事。

// open zip
$zip = new ZipArchive;
$zip->open($zipName, ZipArchive::CREATE);

// add pdfs to zip file
$zip->addEmptyDir('.'); // does not help
foreach($arPDFs as $thisPDF) {
    if (File::exists(config('path')['scTemp'].$thisPDF)) {
        $zip->addFile(config('path')['scTemp'].$thisPDF,$thisPDF);
    }
}

// close zip
$zip->close();

// delete all pdfs
foreach($arPDFs as $thisPDF) { 
    if (File::exists(config('path')['scTemp'].$thisPDF)) {
        File::delete(config('path')['scTemp'].$thisPDF);
    }
}

// download zip file
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$zipName);
header('Content-Length: '.filesize($zipName));
readfile($zipName);
php laravel ziparchive php-zip-archive

评论


答:

1赞 Karl Hill 8/3/2023 #1

在创建新文件之前,您需要确保删除以前的 zip 文件。

use Illuminate\Support\Facades\File; 

// Define the zip file name
$zipName = 'new_archive.zip';

// Check if the previous zip file exists and delete it
if (File::exists($zipName)) {
    File::delete($zipName);
}

// Create a new zip archive
$zip = new ZipArchive;
$zip->open($zipName, ZipArchive::CREATE);

// Add pdfs to the zip file
foreach ($arPDFs as $thisPDF) {
    if (File::exists(config('path')['scTemp'] . $thisPDF)) {
        $zip->addFile(config('path')['scTemp'] . $thisPDF, $thisPDF);
    }
}

// Close the zip archive
$zip->close();

// Download the zip file
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename=' . $zipName);
header('Content-Length: ' . filesize($zipName));
readfile($zipName);

评论

0赞 Paul Godard 8/4/2023
谢谢!这确实非常合乎逻辑......
2赞 hakre 8/3/2023 #2

这就是 zip 的一般工作方式,如果文件已经存在,您可以修改它。除了 Karl Hill 的回答中概述的内容外,您还可以使用 ZipArchive::OVERWRITE 标志(文件名后面的第二个参数)打开 () 它。

$zip->open($zipName, ZipArchive::CREATE | ZipArchive::OVERWRITE)
  || throw new Error("Unable to open the Zip archive!");

这应该更好地反映您打开它的意图。