Partage
  • Partager sur Facebook
  • Partager sur Twitter

Php download, fichier zip corrompu

    17 juillet 2018 à 1:48:52

    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.

    • Partager sur Facebook
    • Partager sur Twitter
      17 juillet 2018 à 7:52:40

      Bonjour,

      Tu devrais utiliser la classe Zip de php pour éviter ce genre de problème:

      http://php.net/manual/fr/book.zip.php

      • Partager sur Facebook
      • Partager sur Twitter
      "Ils ne savaient pas que c'était impossible, alors ils l'ont fait" Mark Twain
        17 juillet 2018 à 22:41:01

        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;

        ?>
        • Partager sur Facebook
        • Partager sur Twitter
          18 juillet 2018 à 2:42:18

          Salut normalement avec ces header cela devrait fonctionner correctement:

          sans effacer le zip une fois télécharger:

          $dir = "lol/"; // trailing slash is important
          $file = String($dir.$_POST['filename']);
          
          if(file_exists($file))
          {
          	header('Content-Description: File Transfer');
          	header('Content-Type: application/octet-stream');
                  header('Content-Disposition: attachment; filename="'.basename($file).'"');
           	header('Expires: 0');
          	header('Cache-Control: must-revalidate');
          	header('Pragma: public');
          	header('Content-Length: ' . filesize($file));
          	readfile($file);
          	exit;
          }
          else
          {
          	return;
          }

          version pour effacer le zip juste après télèchargement:

          if(file_exists($file))
          {
          	header('Content-Description: File Transfer');
          	header('Content-Type: application/octet-stream');
          	header('Content-Disposition: attachment; filename="'.basename($file).'"');
          	header('Expires: 0');
          	header('Cache-Control: must-revalidate');
          	header('Pragma: public');
          	header('Content-Length: ' . filesize($file));
          	readfile($file);
          	unlink($file);
          	exit;
          }
          else
          {
          	return;
          }

          a utiliser que si y'as régénération du zip après car sinon le zip n'existe plus une fois télécharger.



          -
          Edité par leo_sky 18 juillet 2018 à 2:44:37

          • Partager sur Facebook
          • Partager sur Twitter
            18 juillet 2018 à 22:33:23

            Hello, penses également à vérifier le fichier que tu essaies de télécharger ! S'il a été corrompu pendant l'upload, tu n'as pas fini de chercher !

            Bon courage.

            • Partager sur Facebook
            • Partager sur Twitter
              22 juillet 2018 à 17:06:04

              Le cache avec ob me parait pas grandement utile pour un téléchargement...

              Pour le exit il me semble plus correcte de l'appeler directement après readfile ou unlink.

              Avec JavaScript coupler possibilité de gérez la validation ou annulation avec window.confirm(), ca permet de génèrez le zip que si l'utilisateur le veut puis de l'effacer immédiatement.

              Sinon il y'a l'attribut download html5.

              A oui et le code de téléchargement que j'ai mis au dessus est utiliser en asynchrone, après avec ou non asynchrone, il devrait fonctionner correctement, c'est toujours une précision qui peut servir au cas ou.

              Sinon j’espère que problème résolu :)
              • Partager sur Facebook
              • Partager sur Twitter

              Php download, fichier zip corrompu

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown