IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Génération d'archive zip sous Symfony [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Homme Profil pro
    PHP + JAVA
    Inscrit en
    Mars 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : PHP + JAVA

    Informations forums :
    Inscription : Mars 2009
    Messages : 65
    Points : 60
    Points
    60
    Par défaut Génération d'archive zip sous Symfony
    Bonjour à toutes et à tous,
    J'ai essayé de créer une archive zip sous Symfony et de la proposer au téléchargement à l'utilisateur. Voici le code que j'ai produit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    public function zipAllDataAction(){
            $annee_choix=$_POST['choix_annee'];
            $zip=new \ZipArchive();
            $opened_zip=null;
            $zipname="php://memory";
            if ($zip->open($zipname,\ZipArchive::CREATE)!==TRUE){
                \Doctrine\Common\Util\Debug::dump("Impossible d'ouvrir le fichier");
            }else{
                //$zip->addFromString("le nom", $contents);//à faire pour toutes les extractions
     
                $directory=$this->container->get('kernel')->getRootdir()."/../web/resources/Logistique/Etat_stock_conso";
                $files=array_diff(scandir($directory),array('..','.'));
                foreach ($files as $file){
                    //$nom_fichier=$value;
                    //\Doctrine\Common\Util\Debug::dump($nom_fichier);
                    if (!$zip->addFile($directory."/".$file,"Etat_stock_conso/".$file)){
                        \Doctrine\Common\Util\Debug::dump("Ajout de fichier impossible");
                    }//à faire pour les états des stocks des conso.
                }
                $zip->close();
                //$zip=zip_open($zipname);
                //$content=stream_get_contents($zip);
                //application/zip
                return new Response(readfile($zipname), 200, array(
                        'Content-Transfert-encoding: binary',
                        'Content-Type' => 'application/zip',
                        'Content-Disposition' => 'attachment; filename="Export.zip"',
                        'Content-Length: '.filesize("Export.zip")
                        ));
            }
        }
    Dans la plupart des tutoriels que j'ai regardé qur le net, ceux-ci mettent un nom à la variable zipname que j'ai. Par exemple, dans mon cas "Export.zip" à la place de "php://memory". Sauf que lorsque je fait ça, non seulement l'utilisateur ne se vois pas proposé l'archive au téléchargement et en plus obtient une page avec pleins de signes cabalistiques qui je suppose correspond à l'archive elle-même mais sous forme écrite (donc c'est horrible ). Quand je laisse "php://memory" l'archive est bien proposée au téléchargement, sauf que lorsque je l'ouvre cela provoque l'erreur suivante:
    Archive: /tmp/Export-3.zip
    [/tmp/Export-3.zip]
    End-of-central-directory signature not found. Either this file is not
    a zipfile, or it constitutes one disk of a multi-part archive. In the
    latter case the central directory and zipfile comment will be found on
    the last disk(s) of this archive.
    zipinfo: cannot find zipfile directory in one of /tmp/Export-3.zip or
    /tmp/Export-3.zip.zip, and cannot find /tmp/Export-3.zip.ZIP, period.
    Lorsque je crée l'archive il n'y a aucune erreur. En ce qui concerne les chemins de fichiers je suis sûr que ce sont bien ceux-ci puisque c'est moi même qui les ait créé. Donc jusqu'au "close" aucune erreur. Si vous avez quelques idées et/ou suggestions de corrections à faire merci d'avance pour votre aide.

  2. #2
    Membre du Club
    Homme Profil pro
    PHP + JAVA
    Inscrit en
    Mars 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : PHP + JAVA

    Informations forums :
    Inscription : Mars 2009
    Messages : 65
    Points : 60
    Points
    60
    Par défaut Solution presque touvée
    Alors lorsque j'ai remis un nom à ma variable zipanme (Export.zip), j'ai évidemment à nouveau obtenu la page où il y avait des signes cabalistiques horribles dont j'ai parlé dans mon dernier post. Je me suis dit: "Et si j'enregistrais ma page obtenue en tant que zip". je le fais et là ho miracle mon archive zip apparaît et s'ouvre correctement (enfin pas tout à fait comme je voulais mais bon bref) . Je me dis: "c'est pas possible quand même il doit y avoir une astuce quelque part". Je cherche sur le net pas grand chose sinon un ob_start et un ob_end_clean (et donc toujours le même problème). Et c'est là que la lumière fut voici le code que j'ai trouvé et qui donne une solution ête comme choux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    public function zipAllDataAction(){
            ob_start();
            $annee_choix=$_POST['choix_annee'];
            $_POST['choix_annee']=$annee_choix;
     
            $zip=new \ZipArchive();
            $opened_zip=null;
            $zipname="Export.zip";
            if ($zip->open($zipname,\ZipArchive::CREATE)!==TRUE){
                \Doctrine\Common\Util\Debug::dump("Impossible d'ouvrir le fichier");
            }else{
                $extract_conso=$this->extractionConsoAnnuelAction();
                $zip->addFromString("Consommables_Fournitures_'.$annee_choix.'.csv", $extract_conso);//à faire pour toutes les extractions
     
                $directory=$this->container->get('kernel')->getRootdir()."/../web/resources/Logistique/Etat_stock_conso";
                $files=scandir($directory);
                foreach ($files as $key => $value){
                    $nom_fichier=$value;
                    if (strcmp(".", $nom_fichier)!=0||strcmp("..", $nom_fichier)!=0){
                        if (!$zip->addFile($directory."/".$nom_fichier,"Etat_stock_conso/".$nom_fichier)){
                            \Doctrine\Common\Util\Debug::dump("Ajout de fichier impossible");
                        }//à faire pour les états des stocks des conso.
                    }
                }
                $zip->close();
                ob_end_clean();
                $zip=fopen($zipname, "r");//astuce ici
                $content=stream_get_contents($zip);// et ici
                //application/zip
                return new Response($content, 200, array(
                        'Content-Transfert-encoding: binary',
                        'Content-Type' => 'application/zip',
                        'Content-Disposition' => 'attachment; filename="Export.zip"',
                        'Content-Length: '.filesize("Export.zip")
                        ));
            }
        }
    En fait il suffit de faire un fopen tout couillon et de lire l'archive comme un fichier normal et là miracle plus d'affichage cabalistique tout pourri, l'archive se télécharge, s'ouvre correctement et contient ce que je veux ou presque. Alors maintenant que mon problème de génération d'archive en tant que telle est résolue. J'aimerais savoir pourquoi il arrive à me mettre dans mon archive d'autre fichiers que je ne veux pas. En effet le phénomène se passe lorsque je parcours mon directory (cf. variable). Le scandir me donne également des fichiers qui ne sont même pas dans le dossier mais qui sont dans une frère et non fils. Alors si vous savez d'où viens le problème je suis preneur.
    [EDIT] Je viens de tester avec un opendir tout simple même souci. Il arrive à remonter dans l'arborescence alors qu'aucune insctruction ne l'indique

  3. #3
    Membre du Club
    Homme Profil pro
    PHP + JAVA
    Inscrit en
    Mars 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : PHP + JAVA

    Informations forums :
    Inscription : Mars 2009
    Messages : 65
    Points : 60
    Points
    60
    Par défaut
    Problème résolu. J'avais a priori un problème de cache plutôt bizarre mais bon. Pour ceux qui sont intéressés par la création d'archive. Il y a ici la solution adaptée à Symfony 2.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $annee_choix=$_POST['choix_annee'];
    il existe un objet Request !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Génération d'un ZIP sous VB6
    Par pcvesoul dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 12/12/2008, 16h26
  2. [C#] [WinForms] Lecture d'un fichier dans une archive ZIP
    Par aegypius dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/12/2004, 17h15
  3. Zip sous linux
    Par oli2a dans le forum Administration système
    Réponses: 3
    Dernier message: 10/11/2004, 01h14
  4. Réponses: 3
    Dernier message: 20/09/2004, 09h00
  5. Archive::Zip
    Par Cyspak dans le forum Modules
    Réponses: 2
    Dernier message: 09/09/2003, 13h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo