Archive zip corrupted php download

Fermé
teddy76db
Messages postés
99
Date d'inscription
dimanche 18 janvier 2009
Statut
Membre
Dernière intervention
1 septembre 2019
- 17 juil. 2018 à 01:53
teddy76db
Messages postés
99
Date d'inscription
dimanche 18 janvier 2009
Statut
Membre
Dernière intervention
1 septembre 2019
- 18 juil. 2018 à 22:16
Bonsoir à tous,

voilà je suis très embêté mon script fonctionne de téléchargement fonctionne très bien sauf qu'à la fin du téléchargement les fichiers .zip sont corrompus si vous avez l'aimabilité de m'éclairer s'il vous plait merci.

Voici mon code :


<?php
$dir = "lol/"; // trailing slash is important
$file = $dir .$_POST['filename'] ;

if (file_exists($file)) {
ob_start();
header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
header('Pragma: public');
header("Expires: 0");
header("Accept-Ranges: bytes");
header("Connection: keep-alive");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Transfer-Encoding: binary");
header('Content-Description: File Transfer');
header("Content-type: application/zip");
header('Content-Disposition: attachment; filename='.basename($file));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Content-Length: ' . filesize($file));
ob_clean();
readfile($file);

} else {
echo "Le fichier $file n'existe pas.";
}
exit;

?>


J'utilise la méthode POST filename afin de récupérer le nom du fichier téléchargé sur mon site, cordialement.
A voir également:

4 réponses

jordane45
Messages postés
36291
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 septembre 2022
4 346
17 juil. 2018 à 06:51
Bonjour
Et le fichier... c'est un fichier. Zip au départ ou tu essais de le zipper au moment du téléchargement ?
0
ElementW
Messages postés
4764
Date d'inscription
dimanche 12 juin 2011
Statut
Contributeur
Dernière intervention
5 octobre 2021
1 299
17 juil. 2018 à 11:29
'lut,
tu as pris du code de je ne sais où en collant les morceaux n'importe comment, ce qui explique sans doute ton problème:
  • On ne spécifie pas un code HTTP via
    header
    , c'est via
    http_response_code
    que ça se fait
  • Tu spécifies
    Expires
    2 fois. Enlèves-en un.
  • Tu mets
    Accept-Ranges: bytes
    alors que ton code ne supporte pas la reprise de téléchargement avec les ranges. C'est potentiellement la source de tes zip corrompus, où certains navigateurs téléchargent les premiers octets du fichier, puis le reste avec une 2e requête si l'en-tête est présent, dupliquant l'en-tête ZIP et un peu de données. Soit tu retires, soit tu implémentes les ranges
  • Connection: keep-alive
    c'est pas tes oignons car tu ne peux pas forcer une connexion keep-alive en PHP, c'est au serveur qui fait tourner le PHP de mettre cet en-tête si ça lui chante
  • Content-Description
    n'existe pas. À retirer, c'est superflu

Et enfin et surtout, d'où vient l'idée idiote d'utiliser
ob_clean
? Comme tu fais un
ob_start
avant, en faisant un clean tu nettoies tous les en-têtes que tu viens de définir, sans les envoyer. C'est plutôt
ob_end_flush
que tu cherches
.
0
teddy76db
Messages postés
99
Date d'inscription
dimanche 18 janvier 2009
Statut
Membre
Dernière intervention
1 septembre 2019
3
17 juil. 2018 à 22:16
Merci pour ta réponse cette fois-ci avec ce code le téléchargement se fait mais avant la fin cela télécharge le zip à 578ko sur 600ko, avec pour erreur : erreur réseau :

<?php
$dir = "lol/"; // trailing slash is important
$file = $dir .$_POST['filename'] ;

if (file_exists($file)) {
ob_start();
header("HTTP/1.1 200 OK");
header('Pragma: public');
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Transfer-Encoding: binary");
header("Content-type: application/zip");
header('Content-Disposition: attachment; filename='.basename($file));
header('Cache-Control: must-revalidate');
header('Content-Length: ' . filesize($file));
ob_end_flush();
readfile($file);

} else {
echo "Le fichier $file n'existe pas.";
}
exit;

?>
0
teddy76db
Messages postés
99
Date d'inscription
dimanche 18 janvier 2009
Statut
Membre
Dernière intervention
1 septembre 2019
3
17 juil. 2018 à 23:36
Correction de ma part j'utilise ce code et toujours un problème d'erreur réseau le téléchargement s'arrête à 586ko au lieu de 600ko ...

<?php
$dir = "lol/"; // trailing slash is important
$file = $dir .$_POST['filename'] ;

if (file_exists($file)) {
header('Pragma: public');
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Transfer-Encoding: binary");
header("Content-type: application/zip");
header('Content-Disposition: attachment; filename='.basename($file));
header('Cache-Control: must-revalidate');
header('Content-Length: ' . filesize($file));

readfile($file);

} else {
echo "Le fichier $file n'existe pas.";
}
exit;
?>
0
teddy76db
Messages postés
99
Date d'inscription
dimanche 18 janvier 2009
Statut
Membre
Dernière intervention
1 septembre 2019
3
18 juil. 2018 à 22:16
Bonjour,

j'ai résolu le problème grâce à un forum Anglais là où ils sont beaucoup compréhensifs et plus sympathiques (ElementW merci pour ta bonne humeur, ironie)...
0