Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks
Bibliothèques et frameworks Forum d'entraide sur les frameworks, templates, bibliothèques de code (PDFLib, eZPdf, JpGraph, Artichow, PEAR, etc). Avant de poster : FAQ bibliothèques, toutes les FAQ PHP et cours bibliothèques
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/10/2007, 11h48   #1
Invité de passage
 
Inscription : octobre 2007
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 23
Points : 3
Points : 3
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
Fatjo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 13h24   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 14h09   #3
Invité de passage
 
Inscription : octobre 2007
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 23
Points : 3
Points : 3
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
Fatjo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 14h10   #4
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Peut-être celle-là : http://fr.php.net/manual/fr/ref.zip.php
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 14h27   #5
Invité de passage
 
Inscription : octobre 2007
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 23
Points : 3
Points : 3
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
Fatjo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 14h31   #6
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
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.
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 14h41   #7
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
L'état actuel de l'extension Zip facilite beaucoup son usage. Un exemple utilisant SimpleXML et la propriété des flux Zip :
Code :
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");
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 14h59   #8
Invité de passage
 
Inscription : octobre 2007
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 23
Points : 3
Points : 3
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 :
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
Fatjo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 15h07   #9
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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) ?
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 15h21   #10
Invité de passage
 
Inscription : octobre 2007
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 23
Points : 3
Points : 3
-_- Effectivement je suis sous php 4.3.10...
php 5.2 est requis ou facultatif ? :/
Fatjo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 17h40   #11
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Pour vos besoins, les fonctions PHP 4 devraient alors suffire :
Code :
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.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2007, 11h32   #12
Invité de passage
 
Inscription : octobre 2007
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 23
Points : 3
Points : 3
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
Fatjo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2007, 11h34   #13
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
dans ton fichier php.ini tu dois avoir une ligne du style
Code :
; extension=php_domxml.dll
il faut que tu enlèves le ; devant pour l'activer (et redémarrer Apache)
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2007, 14h14   #14
Invité de passage
 
Inscription : octobre 2007
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 23
Points : 3
Points : 3
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 :
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");
Fatjo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2007, 14h19   #15
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Est-ce par upload que vous obtenez le fichier zip ? Si tel est le cas, votre formulaire est erroné :
Code HTML :
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 :
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.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2007, 14h23   #16
Invité de passage
 
Inscription : octobre 2007
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 23
Points : 3
Points : 3
Ok, et je met quoi à la place de ['tmp_name'] ? :o

Maintenant j'ai ceci dans le formulaire :

Code :
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 :
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");
Fatjo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2007, 14h38   #17
Invité de passage
 
Inscription : octobre 2007
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 23
Points : 3
Points : 3
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 !
Fatjo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2007, 11h41   #18
Invité régulier
 
Inscription : avril 2004
Messages : 9
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 9
Points : 7
Points : 7
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
Citation:
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
cwamgis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2007, 17h04   #19
Invité régulier
 
Inscription : avril 2004
Messages : 9
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 9
Points : 7
Points : 7
bon bin ca marche sur mon serveur de production, je vais pas me prendre la tête trop longtemps tant pis

Merci quand meme
cwamgis est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h38.


 
 
 
 
Partenaires

Hébergement Web