Почему изменение или добавление файла в Zip в PHP с помощью ZipArchive портит его? - PullRequest
3 голосов
/ 20 сентября 2019

Итак, у меня есть заархивированный пакет загрузки для программы, которую я написал, и я пытаюсь написать свой скрипт сообщения об ошибках таким образом, чтобы при отправке он записывал данные об ошибках в файл под названием «ошибки».xml 'в почтовом индексе.Мой Zip-файл выглядит так до запуска этого скрипта:

titrek_0.0.28.zip / ---
         / TITREK.8xp
         / changelog.txt
         / trekgui.8xv

Вот код, который я использую для изменения почтового индекса, как указано:

<?php
if(isset($_POST['sendbug'])){
    if($_POST['short'] == "") {$errors[] = "Bug title not provided";}
    if($_POST['desc'] == "") {$errors[] = "Description not provided";}
    if(empty($errors)){
        $fileToModify = 'bugs.xml';
        $fileToOpen = $_POST['version'];
        if(!is_writable($fileToOpen)){echo "File not writeable!";}
        $zip = new ZipArchive;
        if ($zip->open($fileToOpen) === TRUE) {
            echo "We got it!";
            $oldData = $zip->getFromName($fileToModify);
            if($oldData === false){
                $string = <<<XML
                    <?xml version='1.0'?>
                    <bugs>
                    </bugs>
                    XML;
                $xml = simplexml_load_string($string);
                echo "Creating new string";
            } else {
                $xml = simplexml_load_string($oldData);
                $zip->deleteName($fileToModify);
            }
            $newbug = $xml->addChild("bug");
            $newbug->addChild("id", count($xml->bug));
            $newbug->addChild("short", $_POST['short']);
            $newbug->addChild("desc", $_POST['desc']);
            $zip->addFromString ('bugs.xml', $xml->asXML());
            if($zip->close() === false) echo "Failed. Likely permission problem.";
        }
    }
}
?>
<form id="bugreporter" method="post" action="">
<div>Bug Reporting</div><br />
Select Version: <select name="version">
<?php
    $types = array("alpha", "beta", "stable");
    foreach($types as $t){
        foreach(array_reverse(glob("/home/trek/www/downloads/" . $t . "/*.zip")) as $file){
            echo "<option value=\"" . $file . "\">";
            echo $t . " - ";
            echo explode("_", basename($file, ".zip"))[1];
            echo "</option>";
        }
    }
?>
</select><br />
<input type="text" name="short" placeholder="A Short Description" /><br />
<textarea name="desc" placeholder="Describe the bug in greater detail here.">
</textarea>
<input type="submit" name="sendbug" value="Submit Bug Report" />
</form>

После запуска этого кода ZIPтеперь выглядит так:

titrek_0.0.28.zip / ---
         / bugs.xml
         / titrek_0.0.28 / ---
                         / TITREK.8xp
                         / changelog.txt
                         / trekgui.8xv

Может кто-нибудь подсказать, пожалуйста, почему это происходит и как это исправить?

...