我有一个压缩目录,其中包含一些文件和子目录。我想要实现的是修改压缩目录的内容,然后下载修改后的zip文件,以便在原始zip文件中不会更改更改。
例如,我想删除压缩目录中的特定文件,然后下载修改后的zip文件,以便该文件仍存在于原始压缩目录中。
到目前为止,这是我的代码。它工作正常,但问题是该文件也在原始压缩目录中被删除:
<?php
$directoryPath = '/Users/Shared/SampleDirectory.zip';
$fileToDelete = 'SampleDirectory/samplefile.txt';
$zip = new ZipArchive();
if ($zip->open($directoryPath) === true) {
$zip->deleteName($fileToDelete);
$zip->close();
}
header('Content-Description: File Transfer');
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="' . basename('SampleDirectory.zip') . '"');
header('Content-Length: ' . filesize('SampleDirectory.zip'));;
readfile('SampleDirectory.zip');
?>
如何实现所需的功能?
答案 0 :(得分:1)
所有zip函数都会更改zip文件的内容。使用PHP的copy()函数在临时位置创建文件副本的最简单方法,并对该文件进行更改。您可以使用tempnam()来避免名称冲突,并在完成后使用unlink()文件。
以下是一个例子:
$directoryPath = '/Users/Shared/SampleDirectory.zip';
$fileToDelete = 'SampleDirectory/samplefile.txt';
$temp = tempnam('/tmp');
copy($directoryPath, $temp);
$zip = new ZipArchive();
if ($zip->open($temp) === true) {
$zip->deleteName($fileToDelete);
$zip->close();
}
header('Content-Description: File Transfer');
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="'.basename('SampleDirectory.zip').'"');
header('Content-Length: ' . filesize($temp));
readfile($temp);
unlink($temp);
警告:未经测试的代码,请确保您已备份文件。