在PHP中修改ZIP文件中的单个文本文件

时间:2010-11-03 08:47:24

标签: php web-applications zip

我的服务器上有一个ZIP文件。我想创建一个PHP文件,loadZIP.php,它将接受一个参数,然后修改ZIP中的文本文件以反映该参数。

因此,访问loadZIP.php?param=blue将打开zip文件,并将我指定的文本文件中的某些文本替换为“blue”,并允许用户下载此编辑的zip文件。

我已查看了所有PHP ZIP函数,但我找不到简单的解决方案。这似乎是一个相对容易的问题,我相信我已经过度思考了。在我去写一些过于复杂的函数之前,我想知道你是怎么做的。

2 个答案:

答案 0 :(得分:31)

您是否看过PHP5的ZipArchive函数?

基本上,您可以使用ZipArchive::Open()打开zip,然后使用ZipArchive::getFromName()将文件读入内存。然后,修改它,使用ZipArchive::deleteName()删除旧文件,使用ZipArchive::AddFromString()将新内容写回zip,ZipArchive::close()

$zip = new ZipArchive;
$fileToModify = 'myfile.txt';
if ($zip->open('test1.zip') === TRUE) {
    //Read contents into memory
    $oldContents = $zip->getFromName($fileToModify);
    //Modify contents:
    $newContents = str_replace('key', $_GET['param'], $oldContents)
    //Delete the old...
    $zip->deleteName($fileToModify)
    //Write the new...
    $zip->addFromString($fileToModify, $newContents);
    //And write back to the filesystem.
    $zip->close();
    echo 'ok';
} else {
    echo 'failed';
}

注意ZipArchive是在PHP 5.2.0中引入的(但是,ZipArchive也可以PECL package形式提供)。

答案 1 :(得分:0)

在PHP 8中,您可以使用ZipArchive::replaceFile

example from the docs所示:

<?php
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
    $zip->replaceFile('/path/to/index.txt', 1);
    $zip->close();
    echo 'ok';
} else {
    echo 'failed';
}
?>