header et fichier zip

Matheo972
Invité n'ayant pas de compte PHPfrance

03 juin 2016, 11:35

Bonjour à tous,

J'essaye d'envoyer un fichier zip au navigateur. Le fichier est bien envoyé mais quand j'essaye de l'ouvrir, j'ai le droit à ce message d'erreur :
L'archive est endommagée ou son format est inconnu
Pourtant le fichier source n'est pas endommagée et se dézip correctement.

Voici mon code :
$zipPath = 'c:\wamp\www\monfichier.zip';
if (headers_sent()) {
    echo 'HTTP header already sent';
} else {
    if (!is_file($zipPath)) {
        header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
        echo 'File not found';
    } else if (!is_readable($zipPath)) {
        header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden');
        echo 'File not readable';
    } else {
        while (ob_get_level()) {
            ob_end_clean();
        }
       ob_start();
       header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
       header("Content-Type: application/zip");
       header("Content-Transfer-Encoding: Binary");
       header("Content-Length: ".filesize($zipPath));
       header('Pragma: no-cache');
       header("Content-Disposition: attachment; filename=\"".basename($zipPath)."\"");
       ob_flush();
       ob_clean();
       readfile($zipPath);
       exit;
    }
}
Merci d'avance pour votre temps consacré à mon problème.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

03 juin 2016, 11:45

Bonjour,

Regarde les logs de ton serveur ou ouvre le fichier que tu as obtenu avec un éditeur de code et tu verras qu'il y a probablement une erreur dans ton code quelque part qui corrompt le fichier en affichant le message d'erreur avant ou après les données du zip
Quand tout le reste a échoué, lisez le mode d'emploi...

Matheo972
Invité n'ayant pas de compte PHPfrance

03 juin 2016, 12:16

En effet,

Dans mon log je trouve cette erreur ci :
[03-Jun-2016 12:12:04 Europe/Paris] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 301375488 bytes) in C:\wamp\www\TelechargementM.php on line 122
Une idée de ce que j'ai pu écrire de mal?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

03 juin 2016, 12:32

Bonjour,

Tu n'as rien écrit de mal. Les ressources mémoire allouées à php sont insuffisantes pour lui permettre de faire l'action demandée ligne 122 de ton script.

Tu peux modifier la taille de la mémoire allouée à php de manière générale dans le fichier de configuration php.ini (memory_limit) qui doit actuellement être à 128M. Dans ton cas et pour traiter ce fichier, il faudrait l'augmenter à 512M.

Tu peux aussi utiliser la méthode ini_set() pour modifier la valeur du paramètre memory_limit ponctuellement : ini_set('memory_limit', '512M');
La valeur -1 te permet de ne pas limiter php et lui laisser disposer de toutes les ressources disponibles (ça n'est cependant pas recommandé :))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...