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

Bibliothèques et frameworks PHP Discussion :

[Zip] PHP pour lire et écrire a partir de .ZIP ?


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 23
    Points : 8
    Points
    8
    Par défaut [Zip] PHP pour lire et écrire a partir de .ZIP ?
    Bonjour,

    Depuis quelque temps je cherches des tutoriaux avec des exemples qui pourrait m'avancer mais je ne trouve pas où plutôt ça ne correspond pas et je n'arrive pas à adapter.

    Jai un dossier ZIP (avec à l'intérieur un fichier XML), à partir d'un formulaire simple qui me demande de selectionner le dossier ZIP, après validation j'aimerais extraire le fichier, écrire dessus en ajoutant une phrase fixe à la ligne 2 enregistrer et afficher la page sur le navigateur... :o

    Comment est-ce possible ? Est-ce super dur ?

    Si quelqu'un a de bons conseils je suis preneur ! Merci d'avance, j'espère que j'ai étais assez explicite.

    A bientôt

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Pour commencer cela dépend de votre version de PHP. Les versions supérieures à 5.2.0 disposent normalement par défaut de l'extension Zip, qui est plus évoluée (et orientée objet) que celle qui existait dans les versions 4 : elle gère l'écriture ou la création d'une archive, elle est capable de considérer une archive comme un flux (ceci vous permet d'aller lire - pas encore écrire - directement un fichier parmi celle-ci).

    Par contre, si vous ne disposez pas de cette extension, il faudra se tourner vers des librairies PHP comme PclZip ou celle qui est distribuée avec phpMyAdmin.

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    Oui, j'utilise phpMyadmin, mais je peux utiliser du php 5.2.0 que je viens d'installer

    Mais question code de la page, avez-vous des exemples ou pouvez vous me dire quelles fonctions à utiliser à peu près

    Merci de la réponse

  4. #4
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212

  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    Oui j'avais déjà regardé ce lien, mais j'arrive pas du tout a adapter ce qu'ils disent avec ce que je veux faire

  6. #6
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Le fichier zip est-il a uploader sur le serveur? En gros est ce que le fichier zip est sur la machine du client?

    Si oui, est ce que tu arrives a gérer l'upload du fichier zip déjà et si oui qu'est ce que tu n'arrives pas à faire dans ce cas?

    Montres nous où tu en es, ca sera un bon support pour commencer.

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    L'état actuel de l'extension Zip facilite beaucoup son usage. Un exemple utilisant SimpleXML et la propriété des flux Zip :
    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
    39
    40
    41
    42
    43
    44
    45
    <?php
    define('FICHIER_ZIP', 'test.zip');
    // Instanciation d'un objet ZipArchive
    $zip = new ZipArchive();
    // Ouverture de l'archive
    if ($zip->open(FICHIER_ZIP) !== TRUE) {
            die("Erreur lors de l'ouverture du fichier Zip");
    }
     
    if (!isset($_POST['fichier'])) {
    ?>
     
    <form method="post">
        Fichier : <select name="fichier">
     
    <?php
        $nbEntrees = $zip->numFiles;
        for ($i = 0; $i < $nbEntrees; $i++) {
            $entree = $zip->statIndex($i);
            if (preg_match('~\.xml$~i', $entree['name'])) {
                printf('<option value="%s">%s</option>', $entree['name'], $entree['name']);
            }
        }
    ?>
     
        </select>
        <br />
        <input type="submit" value="Valider" />
    </form>
     
    <?php
    } else {
        if (!in_array('zip', stream_get_wrappers())) {
            die("La prise en charge des flux ZIP n'est pas disponible");
        }
        printf('Tente de modifier "%s"', $_POST['fichier']);
        // Chargement du fichier XML depuis l'archive
        $sxml = simplexml_load_file(rawurlencode(sprintf('zip://%s#%s', realpath(FICHIER_ZIP), $_POST['fichier'])));
        $sxml->element[1] = 'nouvelle_valeur'; // Modifie la valeur du 2ème élément appelé element
     
        // Modifie le fichier XML au sein de l'archive
        $zip->addFromString($_POST['fichier'], $sxml->asXML());
    }
    // Fermeture de l'archive, c'est à ce moment que les modifications sont réellement prises en compte
    $zip->close() or die("Erreur lors de la fermeture de l'archive");

  8. #8
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    Oui le fichier est sur la machine du client.
    En fait c'est une application intranet, un formulaire tout simple avec un boutton "parcourir" pour choisir le dossier ZIP (contenant toujours qu'un fichier XML) et un boutton valider qui éxécute (et/ou envoie ?) le dossier zip pour le lire et ajouter cette ligne fixe en 1ere ou 2e ligne :

    <?xml-stylesheet type="text/xsl" href="formeROA.xsl"?>

    Après cette mofidication il faudrait que le navigateur affiche la page XML (qui sera lisible puisque la ligne à ajouté c'est pour la mettre en forme)


    Voici le code du formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <html>
     <head>
    <title>Application Intranet pour la transformation des fichiers XML</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
     </head>
      <body>
    <form method="post" action="...">
    Sélectionnez le dossier ZIP souhaité :<br />
    <input type="file" enctype="multipart/form-data" size="50"><br /><br />
    <input type="submit" name="upload" value="Envoyer">
    </form>
      </body>
    </html>
    Voilà il me semble que la vous avez tout :o Merci pour vos réponses et votre aide !!!

    ps: j'ai tester le code de julp, ça m'affiche cela :

    Fatal error: Cannot instantiate non-existent class: ziparchive in c:\program files\easyphp1-8\www\app\app.php on line 4
    (et ligne 4 j'ai bien enlevé test.zip pour mettre le bon nom du dossier)

    Encore merci

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Citation Envoyé par Fatjo Voir le message
    Fatal error: Cannot instantiate non-existent class: ziparchive in c:\program files\easyphp1-8\www\app\app.php on line 4
    (et ligne 4 j'ai bien enlevé test.zip pour mettre le bon nom du dossier)
    L'extension Zip doit, bien évidemment, être activée. Avez-vous réellement une version 5.2.0 sous EasyPHP (de base, et pour la 1.8, il s'agit d'une version 4.3.10 si je ne m'abuse) ?

  10. #10
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    -_- Effectivement je suis sous php 4.3.10...
    php 5.2 est requis ou facultatif ? :/

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Pour vos besoins, les fonctions PHP 4 devraient alors suffire :
    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
    // Contrôle du formulaire ...
     
    // Manipulation du fichier Zip
    if (($zip = zip_open($_FILES['file']['tmp_name'])) === FALSE) {
        die("Erreur de lecture de l'archive");
    }
    $entree = zip_read($zip);
    if (!preg_match('~\.xml$~i', zip_entry_name($entree))) {
        die("Le fichier contenu dans l'archive ne semble pas être un fichier XML");
    }
    zip_entry_open($zip, $entree);
    $contenu = zip_entry_read($entree, zip_entry_filesize($entree));
    zip_entry_close($entree);$dom = domxml_open_mem($contenu);
    $pi = $dom->create_processing_instruction('xml-stylesheet', 'type="text/xsl" href="formeROA.xsl"');
    $dom->insert_before($pi, $dom->document_element());
    zip_close($zip);
    header('Content-type: text/xml');
    echo $dom->dump_mem();
    (Extensions Zip et DOMXML requises)

    Vous devriez cependant envisager de migrer à PHP 5, passage qui ne présente que des avantages puisque vous y serez, sous peu, contraints.

  12. #12
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup mais comment faire pour activer l'extension DOMXML ? j'ai vu que sur php 4.3 elle était dans le dossier mais inactive :s

  13. #13
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    dans ton fichier php.ini tu dois avoir une ligne du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ; extension=php_domxml.dll
    il faut que tu enlèves le ; devant pour l'activer (et redémarrer Apache)

  14. #14
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    Merci, c'est désormais activé
    Mais après validation du formulaire j'ai ce message qui apparaît :

    Notice: Undefined index: file in c:\program files\easyphp1-8\www\app\applic.php on line 6

    Warning: zip_open() Cannot open zip archive in c:\program files\easyphp1-8\www\app\applic.php on line 6
    Erreur de lecture de l'archive


    (J'ai pourtant essayer de placer le dossier zip dans le même dossier que applic.php )


    Comme l'impression que ça vient de mon contrôle du formulaire -_- le voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Contrôle du formulaire
    $zip = $_POST['zip']; 
     
    // Manipulation du fichier Zip
    if (($zip = zip_open($_FILES['file']['tmp_name'])) === FALSE) {
        die("Erreur de lecture de l'archive");

  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Est-ce par upload que vous obtenez le fichier zip ? Si tel est le cas, votre formulaire est erroné :
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <!-- ... -->
    <form method="post" action="...">
    Sélectionnez le dossier ZIP souhaité :<br />
    <input type="file" enctype="multipart/form-data" size="50"><br /><br />
    <!-- ... -->
    L'attribut enctype doit figurer dans la balise form et pas ailleurs :
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <!-- ... -->
    <form method="post" action="..."  enctype="multipart/form-data">
    Sélectionnez le dossier ZIP souhaité :<br />
    <input type="file" size="50" name="file"><br /><br />
    <!-- ... -->
    Dans le cas contraire, il faut modifier $_FILES['file']['tmp_name'] par ce qui vous en indique le nom.

    Edit : il manque aussi le nom (attribut name) à votre input de type file.

  16. #16
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    Ok, et je met quoi à la place de ['tmp_name'] ? :o

    Maintenant j'ai ceci dans le formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <form method="post" action="applic.php" enctype="multipart/form-data">
    Sélectionnez le dossier ZIP souhaité :<br />
    <input type="file" size="50"><br /><br />
    <input type="submit" name="zip" value="Envoyer">
    </form>
    Et dans le début de applic.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Contrôle du formulaire
    $zip = $_POST['zip']; 
     
    // Manipulation du fichier Zip
    if (($zip = zip_open($_FILES['zip']['tmp_name'])) === FALSE) {
        die("Erreur de lecture de l'archive");

  17. #17
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    O-M-G c'est bon ! ça marche niquel ! Résultat obtenu que je voulais à 100% merci pour tout !!!

    J'ai rajouté le nom dans le type file et j'ai corrigé mon contrôle du formulaire et c'est ok !

    Encore MERCI !

  18. #18
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 9
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    J'ai besoin d'effectuer le même genre de chose.
    J'utilise des fichiers ODT que je dois modifier en PHP.
    Je pars donc de modèles ODT renommés en .zip, j'ouvre et modifie le contenu du fichier content.xml comme expliqué ici :

    http://www.oofrance.com/actus/index....riter-avec-php

    Mais ce code ne marche pas et me génère un fichier content.xml inouvrable dans l'archive
    Message WZ50

    Une erreur est survenue lors de l'ouverture, écriture vers, fermeture ou suppression du fichier spécifié. Parmi les causes probables, un nom mal orthographié, un disque plein ou un fichier verrouillé ou en lecture seule. L'opération courante sera abandonnée. Une autre boîte de dialogue contenant des informations plus spécifiques peut être affichée.
    Ce message peut aussi être le résultat d'une archive endommagée. Par exemple, si une archive est endommagée (probablement à cause de la présence de bruit sur la ligne pendant le téléchargement depuis un service en ligne), elle peut contenir des données invalides.

    Copyright © 1991-2001 by WinZip Computing, Inc. All rights reserved.
    En fait si je mets un truc du genre :
    addFromString('content.xml', "taratata")) çà marche et mon fichier est bien ouvrable!
    Dois-je procéder d'une manière diffénrente du fait qu'il s'agit d'un fichier xml?

    Merci

  19. #19
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 9
    Points : 12
    Points
    12
    Par défaut
    bon bin ca marche sur mon serveur de production, je vais pas me prendre la tête trop longtemps tant pis

    Merci quand meme

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 10/05/2008, 17h26
  2. Réponses: 7
    Dernier message: 26/05/2007, 15h14
  3. Utiliser un userform pour lire et écrire dans une feuille de calculs
    Par sebi78 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/04/2007, 19h51
  4. [[xml]->[php]->[MySQL]] script php pour lire du xml
    Par koudjo dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 30/06/2006, 03h18
  5. Réponses: 9
    Dernier message: 05/04/2005, 09h39

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