Problème avec ziparchive

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème avec ziparchive

Re: Problème avec ziparchive

par pacopau » 28 oct. 2016, 18:45

Je regarde aussi, mais j'ai du boulot.
Merci encore
A plus j'espère

F LOUP

Re: Problème avec ziparchive

par moogli » 28 oct. 2016, 15:52

salut,

le problème viens du . qui boucle
<pre>
<?php

/**
 * parcourt d'un répertoire et de ses enfants pour les ajouter au zip
*/
function myRecursiveIterator($path, $zip, $base = '')
{
    echo 'Répertoire de départ : ',$path,'<br />';
    $dir = new DirectoryIterator($path);
    foreach ($dir as $fileinfo) {
        // si c'est . ou .. on passe direct au suivant
        if ($fileinfo->isDot()) {
            continue;
        }
        if (!$fileinfo->isDir()) {
            var_dump($fileinfo->getRealPath(), $fileinfo->getBasename());
            if (!$zip->addFile($fileinfo->getRealPath(), $base .'/'. $fileinfo->getBasename())) {
                echo 'Impossible d'ajouter "'.$fileinfo-> getRealPath().'".<br/>';
            } else {
                echo 'Fichier '.$fileinfo->getFilename().' ajout&eacute;<br />';
            }
        } else {
            // à vérifier
            echo 'répertoire : <br />';
            $zip->addEmptyDir($fileinfo->getBasename());
            $base .= $fileinfo->getBasename();
            myRecursiveIterator($fileinfo->getRealPath(), $zip, $base);
        }
    }
}

$zip = new ZipArchive();

$oppened =$zip->open('Archive.zip', ZipArchive::CREATE);
if ($oppened === true) {
    myRecursiveIterator('./', $zip);
    echo "Nombre de fichiers : " . $zip->numFiles . "\n<br />";
    echo "Statut :" . $zip->getStatusString() . "\n<br />";
    echo "fichier :" . $zip->filename . "\n<br />";
    $zip->close();
} else {
    echo 'Erreur, impossible de cr&eacute;er l'archive.<br/>';
    echo 'code erreur : ', $oppened,'<br />';
}
j'ia un problème pour insérer dans le bon répertoire.
je regarde ce weekend si je peux
@+

Re: Problème avec ziparchive

par pacopau » 27 oct. 2016, 21:25

Rebonjour Moogli,
Depuis un mois et demi, je n'ai pas vu le jour, mais je me suis remis à mon problème d'archive.
En fait le premier script de ton dernier post fonctionne sauf qu'il boucle indéfiniment sur le premier dossier rencontré à archiver et son contenu. Mais je ne connais pas assez les fonctions utilisées pour régler ce problème. D'ailleurs tu as marqué "A vérifier".

Code : Tout sélectionner

<?php /** * parcourt d'un répertoire et de ses enfants pour les ajouter au zip */ function myRecursiveIterator($path, $zip) { $dir = new DirectoryIterator($path); foreach ($dir as $fileinfo) { if (!$fileinfo->isDot() && !$fileinfo->isDir()) { // gaffe à la gestion du path il faut savoir où l'on se trouve dans l'archove et où l'on place le Fichier // a priori si tu ajoutes en nom de fichier (2nd paramètre) un chemin relatif à la racine tu n'as pas de soucis en clair temp/fichier pour /www/tmp/fichier if (!$zip->addFile($fileinfo->getRealPath(), $fileinfo->getBasename())) { echo 'Impossible d'ajouter "'.$fileinfo-> getRealPath().'".<br/>'; } else { echo 'Fichier '.$fileinfo->getFilename().' ajout&eacute;<br />'; } } elseif ($fileinfo->isDir()) { // à vérifier $zip->addEmptyDir ($fileinfo->getBasename()); myRecursiveIterator($fileinfo->getRealPath(), $zip); } } } $zip = new ZipArchive(); $oppened =$zip->open('Archive.zip', ZipArchive::CREATE); if ($oppened === true) { myRecursiveIterator('./', $zip); echo "Nombre de fichiers : " . $zip->numFiles . "\n<br />"; echo "Statut :" . $zip->getStatusString() . "\n<br />"; echo "fichier :" . $zip->filename . "\n<br />"; $zip->close(); } else { echo 'Erreur, impossible de cr&eacute;er l'archive.<br/>'; echo 'code erreur : ', $oppened,'<br />'; }
Désolé mais je vais encore avoir besoin de ton savoir.

Merci d'avance
F LOUP
Pacopau

Re: Problème avec ziparchive

par pacopau » 14 sept. 2016, 09:55

Merci infiniment pour cette réponse précise.
Çà faisait un temps fou que je n'avais pas programmé en PHP et je redécouvre plein de choses intéressantes. Je viens de relire de la doc sur la récursivité des fonctions et ton exemple va m'être précieux pour mieux comprendre en détail.

La moindre des choses sera de te tenir au courant dès que mon script fonctionne, d'ici qques jours (ou plus...)

Merci encore

Je ne mets pas le sujet résolu pour le moment

F Loup
pacopau

Re: Problème avec ziparchive

par moogli » 13 sept. 2016, 14:34

tu peux utiliser un RecursiveDirectoryIterator à la place du DirectoryItérator ;)
cela te permettra de descendre dans l'arborescence simplement.

sinon tu codes toi même lé récursivité en mettant dans une fonction la partie qui parcourt le système de fichier et si l'élément courant elle s'auto appel

ça donne un truc comme ça (non testé)
<?php

/**
 * parcourt d'un répertoire et de ses enfants pour les ajouter au zip
*/
function myRecursiveIterator($path, $zip)
{
    $dir = new DirectoryIterator($path);
    foreach ($dir as $fileinfo) {
        if (!$fileinfo->isDot()  && !$fileinfo->isDir()) {
            // gaffe à la gestion du path il faut savoir où l'on se trouve dans l'archove et où l'on place le Fichier
            // a priori si tu ajoutes en nom de fichier (2nd paramètre) un chemin relatif à la racine tu n'as pas de soucis en clair temp/fichier pour /www/tmp/fichier
            if (!$zip->addFile($fileinfo->getRealPath(), $fileinfo->getBasename())) {
                echo 'Impossible d'ajouter "'.$fileinfo-> getRealPath().'".<br/>';
            } else {
                echo 'Fichier '.$fileinfo->getFilename().' ajout&eacute;<br />';
            }
        } elseif ($fileinfo->isDir()) {
            // à vérifier
            $zip->addEmptyDir ($fileinfo->getBasename());
            myRecursiveIterator($fileinfo->getRealPath(), $zip);
        }
    }
}

$zip = new ZipArchive();

$oppened =$zip->open('Archive.zip', ZipArchive::CREATE);
if ($oppened === true) {
    myRecursiveIterator('./', $zip);
    echo "Nombre de fichiers : " . $zip->numFiles . "\n<br />";
    echo "Statut :" . $zip->getStatusString() . "\n<br />";
    echo "fichier :" . $zip->filename . "\n<br />";
    $zip->close();
} else {
    echo 'Erreur, impossible de cr&eacute;er l'archive.<br/>';
    echo 'code erreur : ', $oppened,'<br />';
}

ou un truc dans le genre (non testé non plus)
<?php

$path = dirname(__FILE__);
$zip = new ZipArchive();

$oppened =$zip->open('Archive.zip', ZipArchive::CREATE);
if ($oppened === true) {
    $Directory = new RecursiveDirectoryIterator($path);
    $Iterator = new RecursiveIteratorIterator($Directory);
    foreach ($Iterator as $fileinfo) {
        if (!$fileinfo->isDot()  && !$fileinfo->isDir()) {
            // gaffe à la gestion du path il faut savoir où l'on se trouve dans l'archove et où l'on place le Fichier
            // a priori si tu ajoutes en nom de fichier (2nd paramètre) un chemin relatif à la racine tu n'as pas de soucis en clair temp/fichier pour /www/tmp/fichier
            $file =  $fileinfo->getPathname() .'/'. $fileinfo->getBasename();
            $zip->addFile($fileinfo->getRealPath(), $file) ;
        } elseif ($fileinfo->isDir()) {
            $zip->addEmptyDir($fileinfo->getBasename());
        }
    }
    echo "Nombre de fichiers : " . $zip->numFiles . "\n<br />";
    echo "Statut :" . $zip->getStatusString() . "\n<br />";
    echo "fichier :" . $zip->filename . "\n<br />";
    $zip->close();
} else {
    echo 'Erreur, impossible de cr&eacute;er l'archive.<br/>';
    echo 'code erreur : ', $oppened,'<br />';
}

@+

Re: Problème avec ziparchive

par pacopau » 12 sept. 2016, 16:06

Re bonjour,

Petite question, comment modifier le script pour qu'il accepte les sous-dossiers et leurs fichiers du répertoire ./ (qui est www). En somme, la totalité du contenu et de l'arborescence du domaine.


Merci encore

F LOUP

Re: Problème avec ziparchive

par pacopau » 12 sept. 2016, 15:50

Bonjour,

Désolé, décidément j'ai fait n'importe quoi (quelques excuses personnelles quand même).
Merci pour ta patience et ta réponse rapide. Ton script fonctionne parfaitement.
En fait celui que je voulais envoyer était très proche du tien :

Code : Tout sélectionner

<?php if (!class_exists("ZipArchive")) { echo "Classe ZipArchive inexistante<br />"; exit; } else {echo "Classe ZipArchive existante<br />";} $zip = new ZipArchive(); $filename = "Archive.zip"; echo $filename."</br>"; $res = $zip->open($filename, ZipArchive::CREATE); if ($res === TRUE) { echo "le fichier ".$filename. " est ouvert\n<br />"; } else{echo "le fichier ".$filename. " n'est pas ouvert\n<br />";} $dir = opendir("."); echo getcwd()."</br>"; while ($fichier = readdir($dir)) { echo $fichier."</br>"; $zip->addFile($fichier); } closedir("."); if (file_exists($filename)) { echo "Archive.zip existe !!!<br />";} else { echo "Archive.zip n'existe pas!!!<br />"; } echo "Nombre de fichiers : " . $zip->numFiles . "\n"; echo "Statut :" . $zip->status . "\n"; $zip->close(); ?>
Je fais afficher les fichiers ajoutés à l'archive, je vérifie tout un tas de choses, mais le fichier Archive.zip restait introuvable.
Je pense effectivement que je ne précise pas le dossier ou le chemin.
Je vais regarder cela de près.

Merci encore

F LOUP

Re: Problème avec ziparchive

par moogli » 12 sept. 2016, 12:03

salut,

le code si dessus n'est pas correct syntaxiquement, tu as deux else à la suite.

c'est le code réel ou tu as modifié des choses avant de poster ?
premier cas vire le dernière else ou place le au bonne endroit.
deuxième cas, sans le code réel c'est perdu d'avance ;)

si tu place l'accolade fermante du premier if avant le dernière else et que tu utilise un sous répertoire ton code est fonctionnel.

Attention tu ne vérifie pas si l'élément courant est un répertoire dans ce cas ça risque de foirer (tu doit programmer la récursivité)

une version qui fonction (modernisée)
<?php
$zip = new ZipArchive();

$oppened =$zip->open('Archive.zip', ZipArchive::CREATE);
if ($oppened === true) {
    $dir = new DirectoryIterator('./');
    foreach ($dir as $fileinfo) {
        if (!$fileinfo->isDot()  && !$fileinfo->isDir()) {
            if (!$zip->addFile($fileinfo->getRealPath(), $fileinfo->getBasename())) {
                echo 'Impossible d'ajouter "'.$fileinfo-> getRealPath().'".<br/>';
            } else {
                echo 'Fichier '.$fileinfo->getFilename().' ajout&eacute;<br />';
            }
        }
    }

    echo "Nombre de fichiers : " . $zip->numFiles . "\n<br />";
    echo "Statut :" . $zip->getStatusString() . "\n<br />";
    echo "fichier :" . $zip->filename . "\n<br />";

    $zip->close();
} else {
    echo 'Erreur, impossible de cr&eacute;er l'archive.<br/>';
    echo 'code erreur : ', $oppened,'<br />';
}
@+

Re: Problème avec ziparchive

par pacopau » 10 sept. 2016, 18:31

Bon, alors j'ai tout faux !
Le problème est le suivant :
Je cherche à zipper les fichiers d'un de mes sites pour faire des sauvegardes. J'ai donc réalisé le petit script php utilisant la
classe ZipArchive suivant:

Code : Tout sélectionner

<?php // On instancie la classe. $zip = new ZipArchive(); if(is_dir('./')) { // On teste si le dossier existe, car sans ça le script risque de provoquer des erreurs. if($zip->open('./Archive.zip', ZipArchive::CREATE) == TRUE) { // Ouverture de l’archive réussie. // Récupération des fichiers. $fichiers = scandir('./'); // On enlève . et .. qui représentent le dossier courant et le dossier parent. unset($fichiers[0], $fichiers[1]); foreach($fichiers as $f) { echo $f.'<br />'; // On ajoute chaque fichier à l’archive en spécifiant l’argument optionnel. // Pour ne pas créer de dossier dans l’archive. if(!$zip->addFile('./'.$f, $f)) { echo 'Impossible d'ajouter "'.$f.'".<br/>'; } else { echo 'Fichier '.$f.' ajouté<br />'; } } echo "Nombre de fichiers : " . $zip->numFiles . "\n<br />"; echo "Statut :" . $zip->status . "\n<br />"; echo "fichier :" . $zip->filename . "\n<br />"; // On ferme l’archive. $zip->close(); } else { // Erreur lors de l’ouverture. // On peut ajouter du code ici pour gérer les différentes erreurs. echo 'Erreur, impossible de créer l'archive.'; } else { // Possibilité de créer le dossier avec mkdir(). echo 'Le dossier "upload/" n'existe pas.'; } } ?>
Les fichiers s'ajoutent bien mais le fichier Archive.zip reste introuvable

Nota : j'ai essayé plusieurs versions similaires de script, j'ai toujours le même problème. Ce doit être un truc tout bête...
Merci d'avance

Re: Problème avec ziparchive

par moogli » 09 sept. 2016, 08:17

ouep et même la question ;)

c'est quoi le problème ?


@+

Problème avec ziparchive

par pacopau » 08 sept. 2016, 20:14

Désolé, j'ai envoyé mon post sans formule de politesse

Merci d'avance pour vos réponses

F LOUP
pacopau