Extraire le contenu d'un zip directement sur son FTP chez free

Dans cette article nous allons voir comment procéder pour dézippé le contenu d’une archive directement sur son FTP free. Ceci peut être très intéressant si on a plusieurs (beaucoup) fichiers à envoyer sur le ftp, parfois ce genre d’upload peut s’avérer très difficile en fonction de la connexion, du logicile client FTP, mais aussi de l’humeur du serveur FTP de chez free. On peut se retrouver avec un certain nombre de fichiers qui ne seront pas envoyé (perdus en route ?!).

L’astuce consiste à mettre tous ses fichiers dans ZIP, uploader le zip sur le FTP et l’extraire sur place avec script PHP. Parce que envoyer UN SEUL fichier quelque soit sa taille, est toujours plus simple que d’en envoyer 36 000.

Pour commencer il faut savoir que Free ne propose aucune librairie PHP pour gérer les archives, donc nous utiliserons une classe de substitution, pour l’exemple, on va utiliser pclzip.

Maintenant, il faut créer un fichier ZIP (test.zip pour l’exemple) dans lequel on mettra tous nos fichiers à uploader sur le FTP.

Ensuite, il faut créer un fichier php (extract.php pour l’exemple) dans lequel on mettra le code suivant (à adapter selon votre cas) :

//Extrait de la documentation de la class.
require_once('pclzip.lib.php');
$archive = new PclZip('test.zip'); //METTRE LE VRAI NOM DU ZIP ;)
//Extrait dans le repertoire courant.
if ($archive->extract() == 0) {
      die("Error : ".$archive->errorInfo(true));
}

maintenant on se retrouve avec 3 fichiers :

  1. extract.php
  2. pclzip.lib.php
  3. test.zip

On peut maintenant envoyer nos 3 fichiers dans le répertoire sensé accueillir les fichiers finaux (contenus dans le zip) sur le FTP.

maintenant prendre son navigateur et aller à l’url http://adresse_du_site.free.fr/repertoire/extract.php

et le tour est joué :-)

N.B. Cette procédure et valable pour tout hébergement mutualisé (ou pas) ne proposant pas les extensions PHP Zlib ou équivalent.

Share

36 Comments

  1. Les dossier ne sont pas décompresser par contre ? Il décompresse tous les fichier dans un seul endroit sans tenir compte de leur dossier d’origine !

    Répondre

  2. la fontion

    function extract($p_path= »./ », $p_remove_path= » »)

    permet de spécifier en premier parametre le répertoire où les fichiers sont extraits.
    DAns la version du pclzip.lib.php que j’ai téléchargé, j’ai simplement eu à modifier l’entête de cette fonction.

    Répondre

  3. bas dans mon fichier extract je fais un copier coller de ce que vous avez fait, ensuite je clique sur extract sur mon site free et il me met ce qui est écrit dans le fichier extract.

    Répondre

  4. le code cité dans le billet est un exemple.

    est-ce que vous avez bien téléchargé la libraire pclzip ? l’avez vous mise sur votre hébergement free ?

    et ensuite le code ci-dessus n’est a prendre telquel, il faut déjà l’entourer de balises < ?php et ?> pour qu’il soit interprété et non pas affiché.

    Répondre

  5. @Matt : je connais (et utilise) 7zip mais notre probleme ici est de déposer un grand nombre de fichiers sur le ftp sans en perdre au moment du transfert, d’où la proposition d’envoyer sur le ftp un zip (fait avec 7zip ou autre, peu importe) et de dezipper directement sur le ftp avec php :)

    Répondre

  6. je viens d’essayer votre méthode, mais j’ai ce message sur mon site…

    extract() == 0) { die(« Error : « .$archive->errorInfo(true)); } ?>

    Répondre

  7. @renaud :
    le code que je donne plus haut est a mettre dans un fichier php donc un fichier qui commence par

    <?php

    je pense que c’est ça qui vous manque ou bien un commentaire pas fermé, sinon on verrait pas le code source php dans le message d’erreur.

    cf commentaire #8

    Répondre

  8. Pour les gens qui ne sont pas habitué avec le php, il faut rajouter les balises spécifiques au début et à la fin du code :

    < ?php //Extrait de la documentation de la class. require_once('pclzip.lib.php'); $archive = new PclZip('test.zip'); //METTRE LE VRAI NOM DU ZIP 😉 //Extrait dans le repertoire courant. if ($archive->extract() == 0) {
    die(« Error : « .$archive->errorInfo(true));
    }
    ?>

    PS merci à la modération d’effacer les messages 20 à 22

    Répondre

  9. les « posent probleme, il faut remplacer par  » (une double côte => touche 3 et # du clavier) ou ‘ (simple côte => touche 4 du clavier).

    il faut mettre :

    die("Error : " .$archive->errorInfo(true));

    ou :

    die('Error : ' .$archive->errorInfo(true));

    c’est la même chose.

    Répondre

  10. Bonjour,

    Mon fichier extract.php est comme ceci

    extract() == 0) {
    die(« Error : « .$archive->errorInfo(true));
    }
    ?>

    j’ai bien telecharger sur mon serveur free :
    – la libraire pclzip.lib.php
    – mon fichier test.zip ( qu est monsite compressé avec izarc )
    – et donc le fihcier extract.php

    le tout mis dans un dossier ‘site’ sur mon hebergeur free.
    lorsque ej rentre, avec mozilla sur mon site : http://monsite.free.fr/site
    je vois bien les 3 fichiers
    je clic sur extract.php, et la je vois son contenu.
    et rien ne se passe, aucune décompression…

    Pouvais vous m’aider ???
    Merci.

    Répondre

  11. Ok, j’ai trouvé l’erreur, il faut supprimer l’espace entre <?php le tout collé.

    Mais j'ai cet erreur qui apparait dans mon navigateur :

    Parse error: syntax error, unexpected T_STRING in monsite/site/extract.php on line 7

    Pouvais vous m'aider ??
    merci.

    Répondre

  12. Donc pour nous résumer, voici un exemple de la page extract.php complète (créée avec Dreamweaver) :

    Document sans nom

    hello
    extract() == 0) {
    die(‘Error : ‘ .$archive->errorInfo(true));
    }
    ?>
    world

    Répondre

  13. Bonjour,

    si tu mets du code php dans ton commentaire, il faut l’entourer de :
    < pre lang="php" >CODE PHP < /pre >

    remplacer CODE PHP par le code en question :)

    sans les espaces dans la balise pre

    Bon courage.

    Répondre

  14. Bonjour,
    Merci pour ce script très util
    une proposition d’amélioration du script, que j’ai implémenté, en passant en paramètre du script le nom du fichier et le « path » :
    il faut modifier comme le dit Marty plus haut :
     » modifier la fontion

    function extract()

    en

    function extract($p_path= "./ ", $p_remove_path="")

    dans pclzip.lib.php  »

    puis le code de extract.php :

    if ($archive->extract("./","") == 0) {
              die("Error : ".$archive->errorInfo(true));
        } else {
            echo "d&eacute;compresion OK de $fichier dans ./ ";
        }
      } else {
        $path = $_GET['path'];
        if ($archive->extract("$path","") == 0) {
              die("Error : ".$archive->errorInfo(true));
        } else {
            echo "d&eacute;compresion OK de $fichier dans $path ";
        }
      }
     
    } else {
      echo "";
      echo "<b> Outil permet de dezipper (utilise pclzip) </b>";
      echo " param&egrave;tres a envoyer : ";
      echo "<b> extract.php?fichier=NOMFICHIERZIP&amp;path=PATH </b>";
      echo "( path non obligatoire vaut par d&eacute;faut \"./\" )";
      echo "";
    }
    ?>

    Répondre

    1. Bonjour,

      Je suis à la recherche de ce type de process pour transférer des fichiers .ics sur un site hébergé chez http://servhome.org.
      J’ai d’abord fais avec succès l’essai sur un ftpperso.free.fr mais lorsque je tente sur mon hébergeur, le serveur ne dépasse pas le premier niveau de l’archive.
      En effet, mon archive.zip contient des .ics à la racine puis 2 dossiers contenant eux aussi des .ics.
      Or, le serveur de Free réussit sans soucis la décompression de l’archive alors que sur celui de mon hébergeur, seuls les .ics de la racine sont créés ainsi que les 2 dossiers mais sans les .ics à l’intérieur des dossiers…
      Donc, je me demande s’il n’y a pas une configuration particulière à effectuer sur le serveur de mon hébergeur (bien que j’en doute, sur le ftpperso.free.fr, je n’ai absolument rien installé!!!)
      Par ailleurs, j’ai essayé la méthode de « Anthony » (post précédent…) mais sans succès.
      J’ai le message suivant:
      Parse error: syntax error, unexpected T_STRING in monsite/site/extract.php on line 11
      Tout comme aziatedu13

      Voilà, si cela inspire quelqu’un je suis preneur d’une solution!

      Répondre

      1. Bonjour,

        à la base cette méthode était utilisée sur le FTP de free parce qu’il perdait certains fichiers lors des transferts quand ils y avait un grand nombre, donc si ça ne fonctionne pas, vous pouvez toujours essayer de les passer « manuellement » sans passer par le script PHP.

        en suite pour s’assurer que le transfert est bon, vous pouvez renvoyer tous les fichiers en cochant la case pour ignorer les fichiers déjà existants sur le FTP ce qui enverrait du coup que les fichiers manquants :)

        Répondre

        1. Merci pour votre réponse rapide.
          Cela dit, je confirme que la méthode fonctionne très bien avec Free.
          Seulement, je souhaite l’utiliser avec un autre hébergeur (http://servhome.org), et là, ça coince!
          En effet, si le zip ne contient pas de dossier, tout est Ok! En revanche, si le zip contient des dossiers avec des fichiers à l’intérieur, alors seuls les dossiers sont créés mais ils restent vides! Voilà mon problème, car je dois zipper une arborescence de calendriers (fichiers .ics) avec des sous dossiers (il y en a 40 pour un poids total de 350 Ko alors que le zip ne pèse que 35 Ko et ne fait qu’un seul fichier donc un seul transfert!!!). Donc sachant que cela tourne chez Free, je ne comprends pas le blocage sur mon hébergeur…
          J’espère avoir été plus clair…

          Merci!

          Répondre

          1. Bonsoir,

            je comprends votre problème, il est surement du à une configuration différente chez servhome par rapport à free, et là malheureusement je ne pense pas pouvoir vous aider, par contre, je continue de penser qu’un envoi classique de votre dossier (350Ko en tout me parait une taille raisonnable :) pour un envoi ftp).

            donc je vous recommande d’envoyer le dossier tel-quel par ftp sans utiliser ni zip ni php pour décompresser, il suffira ensuite de refaire la manipulation plusieurs fois en ignorant à chaque fois les fichiers déjà présents sur le serveur (FileZila est très bien comme client ftp) pour s’assurer que tous les fichiers .ics sont bien passés.

            bon courage :)

  15. Le code source définitif et exempt de bugs, ce trouve ci-après. Le fichier à décompresser sur votre FTP ne devra pas contenir 36000 fichiers si votre hébergeur est Free sinon une Erreur 500 va être générée !!

    Dernière chose, votre archive devra s’appeler « archive.zip » sinon modifier ce nom dans le code source ci-après (respect de la casse et attention avec les ponctuations dans les noms de fichiers, vaut mieux faire simple).

    Cela corrige deux bugs, pour les newbies, c’est du temps de gagner je pense.
    Au total, trois fichiers sera à transférer :
    – extraire.php (le code source suivant que vous aurez copier/coller dans notepad puis nommé extraire.php, évitez Word qui transforme les les  »  » en « «)
    – pclzip.lib.php (a télécharger ici > http://www.phpconcept.net/pclzip/pclzip-downloads , décompresser et ne transférer que pclzip.lib.php)
    – archive.zip (contenant vos fichiers à décompresser)

    <?php
    if(extract() == 0) {
    die(" Error : " .$archive->errorInfo(true));
    }
    ?>

    Répondre

  16. ha oui !!

    le forum déconne à plein tube, ce que j’ai noté au dessus n’a rien à voir, le code source est tronqué… Le forum devrait permettre l’envoi de code source à afficher sans tenter d’interpréter. Quelle perte de temps !! :/

    Faisons simple : Reprenez le code de Guillaume posté le 20 sept 2009 et enlever l’espace entre le < et le ? sur la première ligne, tout doit être collé, puis changer les » » par les guillemets (touche 3 numérique de votre clavier) avant et après le mot Error du code source et le tour est joué! !! !

    Répondre

    1. Bonsoir,

      j’ai arranger le code, mais je pense qu’il manque un bout, il a du être tronqué lors de l’enregistrement.

      pour mettre du code php, il faut l’entourer de balises

      <pre lang="php">
      <?php
      echo "hello world";
      ?>
      </pre>
      

      Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *