如何修改和下载压缩目录而不改变PHP中原始文件的更改?

时间:2017-03-14 10:22:55

标签: php file download directory zip

我有一个压缩目录,其中包含一些文件和子目录。我想要实现的是修改压缩目录的内容,然后下载修改后的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');

?>

如何实现所需的功能?

1 个答案:

答案 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);

警告:未经测试的代码,请确保您已备份文件。