zipper un répertoire

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 : zipper un répertoire

par Xenon_54 » 31 mars 2007, 05:14

PHP 5.2 offre ZipArchive, une version OO utilisant zlib:
http://www.php.net/manual/en/ref.zip.php

PHP doit être compilé avec --enable-zip

par AuPassage » 28 mars 2007, 16:02

Code : Tout sélectionner

include('zip.lib.php'); $zip = new zipfile(); $output="c:\sauve"; @unlink($output.'.zip'); function zip_dir($dir){ global $zip; $dossier = opendir($dir); while ($Fichier = readdir($dossier)) { if ($Fichier != "." && $Fichier != "..") { if(is_dir($dir.$Fichier)) zip_dir($dir.$Fichier.'\\'); else{ $fp = fopen ($dir.$Fichier, 'r'); $content = @fread($fp, filesize($dir.$Fichier)); fclose ($fp); $zip->addfile($content, $dir.$Fichier); } } } } zip_dir('c:\\test\\'); $archive = $zip->file(); $hd=fopen($output.'.zip', "w+"); fwrite($hd, $archive); fclose($hd);

par Ripat » 12 sept. 2006, 12:14

Et si tu ne veux pas réinventer la roue:
http://pear.php.net/package/File_Archive

Tutorial sur:
http://poocl.la-grotte.org/

:wink:

par zigz4g » 12 sept. 2006, 01:46

Salut.
Je voudrais juste rajouter un petit commentaire sur les droits des répertoires Linux/Unix, il est bon de faire des tests avec les droits en 777 pour savoir d'ou peut provenir les problèmes mais il sera très bon de les remettre ensuite dans une bonne configuration.
Autre petit détail, tu parles des droits l'accès aux fichiers mais tu nous a pas dis si c'était bien Apache ou autre serveur qui peu y accéder. Effectivement avec un 777 sur un répertoire tu peux faire beaucoup de chose mais est-que tous les fichiers sont en 777 ??? Regarde le possesseur et le groupe de tes fichiers peut etre en plus.

Le problème des répertoires volumineux peut aussi te poser problème sur le temps de traitement de ton script. Il faudra peut etre voir par passer par un script lancer en ligne de commande.
Je recommanderais plus de faire un joli script bash et de le lancer avec un crontab. Ensuite il ne reste plus qu'a les envoyer ou les proposer aux téléchargement.

par jojolapine » 11 sept. 2006, 11:21

Elle marche très bien sauf dans mon cas, ou je cherche à zipper un répertoire dont la taille et l'arborescenc m'est inconnu...!
Mais je croit que je vais devoir coder une fonction récursive pour le faire avec des fonction de zippage fichier par fichier... :(

par Ripat » 10 sept. 2006, 18:48

Et pourquoi pas utiliser la librairie zlib?
http://php.net/manual/fr/ref.zlib.php

Edit:

Je ne l'avais jamais testée mais cette librairie marche très bien. La partie compression a été écrite par un Français, Jean-Loup Gailly et est identique à l'utilitaire GNU gzip. Un fichier compressé par php zlib peut très bien être décompressé par Linux gunzip et inversément.

Pour l'exemple, voici une petite fonction trouvée sur le net et que j'ai adaptée.
// fonction
function gzip($src, $dest, $overwrite = false){
  $level = 9;   // niveau de compression. 9 = max.
  $dest = $dest.basename($src).".gz";
  if(file_exists($src)){
    $src_handle = fopen($src, "r");
    if(!file_exists($dest) || $overwrite){
      if(! $dest_handle = gzopen($dest, "w$level")) return false;
      while(!feof($src_handle)){
        $chunk = fread($src_handle, 2048);
        gzwrite($dest_handle, $chunk);
      }
      fclose ($src_handle);
      gzclose($dest_handle);
      return true;
    } else {
      echo "$dest existe déjà";
    }
  } else {
    echo "$src n'existe pas";
  }
  return false;
}

// fichier à compresser
$src       = '/home/jeanluc/scripts/test/test2.txt';

// nom répertoire de destination (attention aux droits!). Laisser vide pour répertoire courant
$dest      = '';

// écraser le fichier de destination s'il existe? (false par défaut)
$overwrite = true;

// appel à la fonction (affiche 1 si ok)
echo (int) gzip($src, $dest, $overwrite);

par JazzFinder » 10 sept. 2006, 18:46

merci jazzfinder, mais je ne souhaite pas utiliser de ligne de commandes :wink:
Non, ce n'est pas de la ligne de commande, c'est du PHP uniquement.

De toute façon, quelque chose cloche dans le code que je t'ai donné. J'ai fait plusieurs tests, et le zip obtenu ne dépasse guère les 1 Kb, et est impossible à consulter. Désolé.

Quelqu'un d'expérimenté sur ce forum peut certainement mieux te conseiller, ou encore essayer de débuguer ce code.

par jojolapine » 10 sept. 2006, 17:04

merci jazzfinder, mais je ne souhaite pas utiliser de ligne de commandes :wink:

par JazzFinder » 10 sept. 2006, 17:02

Un script que j’avais dans mes archives. Je ne peux te garantir la compatibilité avec des versions récentes de PHP.

Très pratique pour produire des zip à la volée de répertoires, et les consulter offline.

Dans ce cas, tu peux donner un lien .php à ton fichier zippé. En cliquant dessus, le «zippage» du répertoire se fait à la volée. Très pratique aussi quand le contenu de ce répertoire change, mais qu’on désire avoir un zip toujours actuel. Dans ce cas, pas besoin d’offrir un fichier .zip, qui nécessiterait une certaine maintenance, mais, comme je le disais, donner un zip dynamique avec une extension .php

Pour que ça marche, ce nouveau fichier .php aura le même nom que celui du répertoire zippé, et doit résider dans le même répertoire (source).

Supposons que ton répertoire s'appelle dir, ton lien doit être qqchose du genre: www.ton_site.com/.../.../dir.php
<?php
// Ce script zippe un répertoire et son contenu à la volée et le rend disponible

// Obtenir le nom de ce fichier php, sans extension, qui est également le nom du répertoire à zipper
$filename_no_ext=str_replace(".php","",basename($SCRIPT_NAME));

// On livre le fichier zip
header("Content-Type: archive/zip");

// Nom sous lequel le navigateur doit sauvegarder le fichier zip
header("Content-Disposition: attachment; filename=$filename_no_ext".".zip");

// Obtenir un nom temportaire (tmp) pour le .zip
$tmp_zip = tempnam ("tmp", "tempname") . ".zip";

// Zipper tout dans le fichier tmp_zip
`zip -r $tmp_zip $filename_no_ext`;
 
// Calculer la taille du zip. Ceci est nécessaire pour la barre de progression du navigateur
$filesize = filesize($tmp_zip);
header("Content-Length: $filesize");

// Livrer le fichier zip
$fp = fopen("$tmp_zip","r");
echo fpassthru($fp);

// clean up the tmp zip file
`rm $tmp_zip `;
?>
Notes:
- Le fichier .php (et donc le nom du répertoire) ne doit pas contenir de caractères spéciaux, ni des espaces (des blancs).
- Attention aux headers. Pas d'espace avant leur envoi.

par jojolapine » 10 sept. 2006, 16:59

Euh j'ai peur de pas trop comprendre...?
Si je fait ce que tu me dits d'utiliser juste pcl, ça ne me cré rien du tout, n'affiche aucune erreur ...?
Pour tant c'est vrai qu'en relisant la doc pcl, ça devrait pouvoir marcher...

edit: autant pour moi, c'étaitune erreur de chemin relatif, il n'arrivai pas à trouver mon répertoire, par contre, il n'arrive toujours pas à ouvrir mon fichier .zip comme la première erreur citée plus haut

par naholyr » 10 sept. 2006, 16:39

Je pense que c'est un problème de droits d'écriture sur le dossier dans lequel tu veux créer le dossier. Essaie de faire un chmod 777 sur le dossier.
Edit : ah oui tu l'as déjà fait, as-tu essayé de créer un fichier texte bidon dans ce dossier à l'aide du même script mais sans pclzip (pour test fopen() en mode 'wb') ?

Note : plutôt que d'utiliser la surcouche citée plus haut, à ta place j'utiliserais directement PCLZip :
<?php
  include('pclzip.lib.php');
  $archive = new PclZip('archive.zip');
  $archive->create('dossier/');
?>

par jojolapine » 10 sept. 2006, 14:29

euh...
par contre j'arrive pas à le faire marcher ... :(
Quelqu'un l'a déja utilisé cette librairie?
Alors voilà le message d'erreur que j'ai:

Code : Tout sélectionner

Erreur de compression : PCLZIP_ERR_READ_OPEN_FAIL (-2) : Unable to open archive './archives/dl2006-09-10_121209093636.zip' in wb mode
c'est visiblement un problème avec pclzip, mais j'ai mit tout le répertoire en 777, donc bon je sais pas trop quoi faire... une idée?

par jojolapine » 10 sept. 2006, 13:59

:oops: c'est bon c'est fait :roll:
Je regarde si ça marche!
merci

par HD » 10 sept. 2006, 13:29

mais tu peux t'inscrire :?

par jojolapine » 10 sept. 2006, 13:10

lien interessant mais je ne suis pas inscrit et ne peut donc pas télécharger les sources