Zip Datei beschädigt

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

tklustig

Erfahrenes Mitglied
Hallo Leute,
auf meiner Website biete ich durch folgenden Code Applikationen zum Download an. Dummerweise werden die ZIP Dateien während des Downloads beschädigt. Erst, wenn ich sie über dieses Tool repariert habe, kann ich sie entpacken. Weiß jemand, warum die ZIP Dateien beschädigt werden. Wie muss der PHP Code abgeändert werden, damit sie nicht mehr beschädigt werden?
PHP:
<?php
function makeDownload($file) {
    header("Content-Disposition: attachment; filename=\"$file\"");
    header("Content-Length: " . filesize($file));
    header("Content-Type: application/octet-stream;");
    readfile($file);
}
?>
<?php
$filename1 = "Bomberman.zip";
$filename3 = "Vokabeltrainer.zip";
$filename4 = "PuzzleGame.zip";
$filename5 = "Backgammon.zip";
$filename6 = "Memory.zip";
//$filename7 = "DirectX_SpaceDemo.zip";
$filename8 = "Snaker.zip";
$filename9 = "SpaceShooter.zip";
$filename10 = "Halma.zip";
//$filename11 = "forMatthias.7z";
$dir = getcwd() . '/';
?>

<?php
// Prüfe ERST, ob das Formular schon gesendet wurde (= Ein Knopf gedrückt wurde)
if (!empty($_REQUEST["download1"])) {
    if (file_exists($dir . $filename1)) {
        makeDownload($filename1);
    } else {
        echo("<center><h3>Datei nicht existent</h3></center>");
    }
}
if (!empty($_REQUEST["download2"])) {
    if (file_exists($dir . $filename2)) {
        makeDownload($filename2);
    } else {
        echo("<center><h3>Datei nicht existent</h3></center>");
    }
}
if (!empty($_REQUEST["download3"])) {
    if (file_exists($dir . $filename3)) {
        makeDownload($filename3);
    } else {
        echo("<center><h3>Datei nicht existent</h3></center>");
    }
}
if (!empty($_REQUEST["download4"])) {
    if (file_exists($dir . $filename4)) {
        makeDownload($filename4);
    } else {
        echo("<center><h3>Datei nicht existent</h3></center>");
    }
}
if (!empty($_REQUEST["download5"])) {
    if (file_exists($dir . $filename5)) {
        makeDownload($filename5);
    } else {
        echo("<center><h3>Datei nicht existent</h3></center>");
    }
}
if (!empty($_REQUEST["download6"])) {
    if (file_exists($dir . $filename6)) {
        makeDownload($filename6);
    } else {
        echo("<center><h3>Datei nicht existent</h3></center>");
    }
}
/*
if (!empty($_REQUEST["download7"])) {
    if (file_exists($dir . $filename7)) {
        makeDownload($filename7);
    } else {
        echo("<center><h3>Datei nicht existent</h3></center>");
    }
}
*/
if (!empty($_REQUEST["download8"])) {
    if (file_exists($dir . $filename8)) {
        makeDownload($filename8);
    } else {
        echo("<center><h3>Datei nicht existent</h3></center>");
    }
}
if (!empty($_REQUEST["download9"])) {
    if (file_exists($dir . $filename9)) {
        makeDownload($filename9);
    } else {
        echo("<center><h3>Datei nicht existent</h3></center>");
    }
}
if (!empty($_REQUEST["download10"])) {
    if (file_exists($dir . $filename10)) {
        makeDownload($filename10);
    } else {
        echo("<center><h3>Datei nicht existent</h3></center>");
    }
}
/*
if (!empty($_REQUEST["download11"])) {
    if (file_exists($dir . $filename11)) {
        makeDownload($filename11);
    } else {
        echo("<center><h3>Datei nicht existent</h3></center>");
    }
}
*/
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Freier Download Bereich</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
        <link rel="icon" href="data:;base64,iVBORw0KGgo=">
        <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
        <script src="plugin/ckeditor/ckeditor.js"></script>
    </head>
    <body>
        <nav class="navbar navbar-expand-lg navbar-light bg-light">
            <div class="collapse navbar-collapse" id="navbarSupportedContent">
                <ul class="navbar-nav mr-auto">
                    <li class="nav-item dropdown">
                        <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                            Home
                        </a>
                        <div class="dropdown-menu" aria-labelledby="navbarDropdown">     
                            <div class="dropdown-divider"></div>
                            <a class="dropdown-item" href="phpinfo.php" target="_blank">PHP Info</a>
                        </div>
                    </li>
                    <li class="nav-item dropdown">
                        <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                            My Websites
                        </a>
                        <div class="dropdown-menu" aria-labelledby="navbarDropdown">
                            <a class="dropdown-item" href="http://tklustig.ddns.net/Bewerbungen/index.php" target="_blank">Bewerbungen</a>                         
                            <a class="dropdown-item" href="http://tklustig.ddns.net/Temperatur/index.php"target="_blank">Temperaturprojekt</a>
                            <a class="dropdown-item" href="http://tklustig.ddns.net/VIRMA/backend/web/index.php"target="_blank">Kalkan-Projekt</a>
                            <a class="dropdown-item" href="http://tklustig.ddns.net/Makler/frontend/web/index.php"target="_blank">Maklerapplikation(Demoversion)</a>                       
                        </div>
                    </li>
                </ul>
            </div>
        </nav>
        <div class="jumbotron">
            <div class = "container">
                <div class="row">
                    <img src="counter.php" title="Pic1" alt="Picture1">
                    <form action="senden.php" class="form-inline" method="post" >
                    <div class="col-md-12">
                    <label style='float:right';>MessageBox</label>
                    </div>
                        <div class="col-md-6">
                            <div class="page-header">
                                <h2>Downloadbereich <small>Laden Sie meine Applikationen runter.... </small></h2>
                            </div>
                        </div>
                        <div class="col-md-6">
                            <div class="form-group">
                                <textarea  rows="3"cols="75" id="comment"  name="MsgBox" placeholder="MessageBox:Nachrichten hier!"><?php
                                    if (!empty($_REQUEST['MsgBox'])) {
                                        echo $_REQUEST['MsgBox'];
                                    }
                                    ?>
                                </textarea>
                                <script>
                                    CKEDITOR.replace('comment');
                                </script>
                            </div>
                            <br>
                            <input type="submit" name="message" class="btn btn-success btn-sm"  value="Absenden">
                            <button class="btn btn-primary btn-sm" onclick="Reload()">Reload Page</button>
                        </div>
                    </form>
                </div>
                <div class="row">
                    <div class="progress">
                        <div class="progress-bar progress-bar-success progress-bar-striped active" style="width: 33%">
                        </div>
                        <div class="progress-bar progress-bar-warning progress-bar-striped active" style="width: 33%">
                        </div>
                        <div class="progress-bar progress-bar-danger progress-bar-striped active" style="width: 33%">
                        </div>
                    </div>
                    <div class="well">
                        <div class="panel panel-default">
                            <div class="panel-body">
                                <div class="alert alert-info" role="alert">Pushen Sie auf einen der Downloadbuttons, um die entsprechende Applikation runterzuladen. Entpacken Sie die komprimierte Datei in einen beliebigen Ordner und starten Sie die jeweilige EXE-Datei, oder den Installationswizzard.</div>
                                <ul>
                                    <li>
                                        Bei Problemen lesen Sie - sofern vorhanden- die ReadmeFirst.txt aufmerksam durch
                                    </li>
                                    <li>
                                        Sollten dennoch Probleme während der Installation auftreten, die Applikation läuft partout nicht, dann schicken Sie mir bitte über die MessageBox eine Nachricht.
                                    </li>
                                    <li>
                                        u.U. kann die Zip File durch den Download beschädigt und somit nicht extrahiert werden. In diesem Falle hilft <a href="https://www.diskinternals.com/zip-repair/" target="_blank">dieses</a> Tool weiter.
                                    </li>
                                     <li>
                                     Rufen Sie auf Wunsch unter &#x261E; Menu &#x261E; My Websites gerne auch meine anderen Webapplikationen auf. Letzere kann gegen ein Entgelt erworben werden, erstere sind frei!
                                    </li>
                                </ul>
                            </div>
                            <div class="panel-footer">
                                <div class="table-responsive">                           
                                    <form action="<?= $_SERVER['SCRIPT_NAME']; ?>"  method="post" >
                                        <table class="table table-striped w-auto">
                                            <thead>
                                                <tr>
                                                    <th>Rubrik</th>
                                                    <th>Applikation</th>
                                                    <th>Programmiersprache</th>
                                                    <th>Download</th>
                                                    <th>Dateigröße(Bytes)</th>
                                                </tr>
                                            </thead>
                                            <tbody>
                                                <tr>
                                                    <td>.NET Game</td>
                                                    <td>Spiel (2D Jump'n'Run)</td>
                                                    <td>VB.NET</td>
                                                    <td><input type="submit" name="download1" class="btn btn-info btn-sm" value="<?= $filename1; ?>"></td>
                                                    <td><?= filesize($filename1); ?></td>
                                                </tr>                       
                                                <tr>
                                                    <td>Sprachen</td>
                                                    <td>Vokabeltrainer</td>
                                                    <td>C# (WinForms)</td>
                                                    <td><input type="submit" name="download3" class="btn btn-info btn-sm"  value="<?= $filename3; ?>"></td>
                                                    <td><?= filesize($filename3); ?></td>
                                                </tr>
                                                <tr>
                                                    <td>Logik</td>
                                                    <td>Puzzle zusammen setzen</td>
                                                    <td>DarkBasic</td>
                                                    <td><input type="submit" name="download4" class="btn btn-info btn-sm" value="<?= $filename4; ?>"></td>
                                                    <td><?= filesize($filename4); ?></td>
                                                </tr>
                                                <tr>
                                                    <td>Logik</td>
                                                    <td>Backgammon (Human vs. PC)</td>
                                                    <td>VB.NET</td>
                                                    <td><input type="submit" name="download5" class="btn btn-info btn-sm" value="<?= $filename5; ?>"></td>
                                                    <td><?= filesize($filename5); ?></td>
                                                </tr>
                                                <tr>
                                                    <td>Logik</td>
                                                    <td>Memory(special edition)</td>
                                                    <td>C# (WinForms)</td>
                                                    <td><input type="submit" name="download6" class="btn btn-info btn-sm" value="<?= $filename6; ?>"></td>
                                                    <td><?= filesize($filename6); ?></td>
                                                </tr>
                                                 <!--
                                                <tr>
                                                    <td>DirectX</td>
                                                    <td>3D Shooter (Demoversion)</td>
                                                    <td>C++</td>
                                                    <td><input type="submit" name="download7" class="btn btn-info btn-sm" value="<?= $filename7; ?>"></td>
                                                    <td><?php //echo filesize($filename7); ?></td>
                                                </tr>
                                                -->
                                                <tr>
                                                    <td>DirectX</td>
                                                    <td>Spiel (2D Catch&Destroy)</td>
                                                    <td>DarkBasic</td>
                                                    <td><input type="submit" name="download8" class="btn btn-info btn-sm" value="<?= $filename8; ?>"></td>
                                                    <td><?= filesize($filename8); ?></td>
                                                </tr>
                                                <tr>
                                                    <td>DirectX</td>
                                                    <td>Spiel (2D Shooter)</td>
                                                    <td>DarkBasic</td>
                                                    <td><input type="submit" name="download9" class="btn btn-info btn-sm" value="<?= $filename9; ?>"></td>
                                                    <td><?= filesize($filename9); ?></td>
                                                </tr>
                                                <tr>
                                                    <td>Logik</td>
                                                    <td>Halma (Human vs. PC)</td>
                                                    <td>C# (WinForms)</td>
                                                    <td><input type="submit" name="download10" class="btn btn-info btn-sm" value="<?= $filename10; ?>"></td>
                                                    <td><?= filesize($filename10); ?></td>
                                                </tr>
                                                                                        <!--    <tr>
                                                    <td>JarForLangwald</td>
                                                    <td>Jar Files, SQL and more</td>
                                                    <td>Java</td>
                                                    <td><input type="submit" name="download11" class="btn btn-info btn-sm" value="<?= $filename11; ?>"></td>
                                                     <td>hier muss das php-Kommando filesize reimplementiert werden</td>
                                                </tr> -->                                       
                                            </tbody>
                                        </table>
                                    </form>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <div class="col-md-12">
        </div>
        <script>
            function Reload() {
                alert("Inhalt wird über JavaScript neu geladen...");
                location.reload();
            }
        </script>
    </body>
</html>
 
Zuletzt bearbeitet:
Meine erste Vermutung hat sich beim Test bestätigt: Wenn ich diesen Code verwende, ist die heruntergeladene ZIP-Datei ebenfalls kaputt:
Code:
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
function makeDownload($file)
{
    header("Content-Disposition: attachment; filename=\"$file\"");
    header("Content-Length: " . filesize($file));
    header("Content-Type: application/octet-stream;");
    readfile($file);
}
?>


<?php
$filename = "birds.zip";
makeDownload($filename);
Grund sind offenbar die Newlines in der Ausgabe, die in die ZIP-Datei gelangen. Lösche ich sie, ist die Datei in Ordnung:
Code:
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
function makeDownload($file)
{
    header("Content-Disposition: attachment; filename=\"$file\"");
    header("Content-Length: " . filesize($file));
    header("Content-Type: application/octet-stream;");
    readfile($file);
}
?><?php
$filename = "birds.zip";
makeDownload($filename);
 
Häh? Was für Zeilenumbrüche meinst Du denn? Ich gebe doch nix aus:unsure:
Bezogen auf meinen Code: Zeile 22, oder ist bereits die Verwendung mehrerer PHP Blöcke ein Problem?
 
Oha, jetzt funktioniert der Download auch bei mir, ohne dass die ZIP Datei beschädigt wird. Danke für Deinen Tip. Da wäre ich von selber nie drauf gekommen. Gut, dass es dieses Forum gibt. Hier nochmals der funktionierende Code:
PHP:
<?php
function makeDownload($file) {
    header("Content-Disposition: attachment; filename=\"$file\"");
    header("Content-Length: " . filesize($file));
    header("Content-Type: application/octet-stream;");
    readfile($file);
}
$filename1 = "Bomberman.zip";
$filename3 = "Vokabeltrainer.zip";
$filename4 = "PuzzleGame.zip";
$filename5 = "Backgammon.zip";
$filename6 = "Memory.zip";
$filename8 = "Snaker.zip";
$filename9 = "SpaceShooter.zip";
$filename10 = "Halma.zip";
$dir = getcwd() . '/';
if (!empty($_REQUEST["download1"])) { // Prüfe ERST, ob das Formular schon gesendet wurde (= Ein Knopf gedrückt wurde)
    if (file_exists($dir . $filename1))
        makeDownload($filename1);
     else
        echo("<center><h3>Datei nicht existent</h3></center>");
}
else if (!empty($_REQUEST["download2"])) {
    if (file_exists($dir . $filename2))
        makeDownload($filename2);
     else
        echo("<center><h3>Datei nicht existent</h3></center>");
}
else if (!empty($_REQUEST["download3"])) {
    if (file_exists($dir . $filename3))
        makeDownload($filename3);
     else
        echo("<center><h3>Datei nicht existent</h3></center>");
}
else if (!empty($_REQUEST["download4"])) {
    if (file_exists($dir . $filename4))
        makeDownload($filename4);
     else
        echo("<center><h3>Datei nicht existent</h3></center>");
}
else if (!empty($_REQUEST["download5"])) {
    if (file_exists($dir . $filename5))
        makeDownload($filename5);
     else
        echo("<center><h3>Datei nicht existent</h3></center>");
}
else if (!empty($_REQUEST["download6"])) {
    if (file_exists($dir . $filename6))
        makeDownload($filename6);
     else
        echo("<center><h3>Datei nicht existent</h3></center>");
}
else if (!empty($_REQUEST["download8"])) {
    if (file_exists($dir . $filename8))
        makeDownload($filename8);
     else
        echo("<center><h3>Datei nicht existent</h3></center>");
}
else if (!empty($_REQUEST["download9"])) {
    if (file_exists($dir . $filename9))
        makeDownload($filename9);
     else
        echo("<center><h3>Datei nicht existent</h3></center>");
}
else if (!empty($_REQUEST["download10"])) {
    if (file_exists($dir . $filename10))
        makeDownload($filename10);
     else
        echo("<center><h3>Datei nicht existent</h3></center>");
}
?>
 
Zuletzt bearbeitet:
Grund sind offenbar die Newlines in der Ausgabe, die in die ZIP-Datei gelangen. Lösche ich sie, ist die Datei in Ordnung:
Häh? Was für Zeilenumbrüche meinst Du denn? Ich gebe doch nix aus:unsure:
Bezogen auf meinen Code: Zeile 22, oder ist bereits die Verwendung mehrerer PHP Blöcke ein Problem?
Oh mein Gott, tut mir leid, aber ich muss das jetzt einfach mal loswerden: Was zum **** :rolleyes:

Zeilenumbrüche in der Quelldatei zerschießen die ZIP?? Das ist nicht besonders robust...
 
@Technipion PHP ist halt auch eine Templatingsprache. Alles, was außerhalb von PHP-Blöcken ist, wird direkt so ausgegeben. Ich glaube, manche PHP Styleguides möchten sogar, dass man PHP-Dateien mit <?php anfängt und gar nicht abschließt. Diese Styleguides basieren dann auf dem Gedanken, dass man für echte Templates mit HTML-Code irgendwie extra Dateien hat -- was auch ganz sinnvoll ist.

Das ist nicht besonders robust...
Deine Meinung kann ich aber vollkommen teilen. In LaTeX passiert mir das leider auch oft, dass Leerzeilen irgendwas zerschießen und erst ein erfahrener LaTeX-Nutzer mir sagen konnte, woher dieser ominöse Fehler kommt.
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…
Zurück