Tayo
Astuce et Tutorial » Programmation / Developpement » Php Mysql » Astuce rédigée par Zabuza
Description de cet article : Dezipper, zipper compresser decompresser en php
Lire les commentaires

Php décompresser compresser un fichier ( unzip zip )



Le but de ce code php est de fournir un moyen, plutôt simple pour zipper, ou dezipper (donc compresser ou décompresser) un , ou plusieurs fichier.



1. Déjà, voici la classe, copier coller tout ça, et l'enregistrer dans un fichier appeller zip.php (par exemple). Cette classe permettra sert de fonction.



[code=php]



class zipfile

{

/**

* array to store compressed data

*

* @var array $datasec

*/

var $datasec = array();



/**

* Central directory

*

* @var array $ctrl_dir

*/

var $ctrl_dir = array();



/**

* end of central directory record

*

* @var string $eof_ctrl_dir

*/

var $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";



/**

* Last offset position

*

* @var integer $old_offset

*/

var $old_offset = 0;





/**

* Converts an Unix timestamp to a four byte DOS date and time format (date

* in high two bytes, time in low two bytes allowing magnitude comparison).

*

* @param integer the current Unix timestamp

*

* @return integer the current date in a four byte DOS format

*

* @access private

*/

function unix2DosTime($unixtime = 0) {

$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);



if (1) {

$timearray['year'] = 2000;

$timearray['mon'] = 1;

$timearray['mday'] = 1;

$timearray['hours'] = 0;

$timearray['minutes'] = 0;

$timearray['seconds'] = 0;

} // end if



return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |

($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);

} // end of the 'unix2DosTime()' method





/**

* Adds "file" to archive

*

* @param string file contents

* @param string name of the file in the archive (may contains the path)

* @param integer the current timestamp

*

* @access public

*/

function addFile($data, $name, $time = 0)

{

$name = str_replace('', '/', $name);



$dtime = dechex($this->unix2DosTime($time));

$hexdtime = 'x' . $dtime[6] . $dtime[7]

. 'x' . $dtime[4] . $dtime[5]

. 'x' . $dtime[2] . $dtime[3]

. 'x' . $dtime[0] . $dtime[1];

eval('$hexdtime = "' . $hexdtime . '";');



$fr = "x50x4bx03x04";

$fr .= "x14x00"; // ver needed to extract

$fr .= "x00x00"; // gen purpose bit flag

$fr .= "x08x00"; // compression method

$fr .= $hexdtime; // last mod time and date



// "local file header" segment

$unc_len = strlen($data);

$crc = crc32($data);

$zdata = gzcompress($data,0); //Change le 0 pour avoir une compression differente

$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug

$c_len = strlen($zdata);

$fr .= pack('V', $crc); // crc32

$fr .= pack('V', $c_len); // compressed filesize

$fr .= pack('V', $unc_len); // uncompressed filesize

$fr .= pack('v', strlen($name)); // length of filename

$fr .= pack('v', 0); // extra field length

$fr .= $name;



// "file data" segment

$fr .= $zdata;



// "data descriptor" segment (optional but necessary if archive is not

// served as file)

$fr .= pack('V', $crc); // crc32

$fr .= pack('V', $c_len); // compressed filesize

$fr .= pack('V', $unc_len); // uncompressed filesize



// add this entry to array

$this -> datasec[] = $fr;

$new_offset = strlen(implode('', $this->datasec));





// now add to central directory record

$cdrec = "x50x4bx01x02";

$cdrec .= "x00x00"; // version made by

$cdrec .= "x14x00"; // version needed to extract

$cdrec .= "x00x00"; // gen purpose bit flag

$cdrec .= "x08x00"; // compression method

$cdrec .= $hexdtime; // last mod time & date

$cdrec .= pack('V', $crc); // crc32

$cdrec .= pack('V', $c_len); // compressed filesize

$cdrec .= pack('V', $unc_len); // uncompressed filesize

$cdrec .= pack('v', strlen($name) ); // length of filename

$cdrec .= pack('v', 0 ); // extra field length

$cdrec .= pack('v', 0 ); // file comment length

$cdrec .= pack('v', 0 ); // disk number start

$cdrec .= pack('v', 0 ); // internal file attributes

$cdrec .= pack('V', 32 ); // external file attributes - 'archive' bit set



$cdrec .= pack('V', $this -> old_offset ); // relative offset of local header

$this -> old_offset = $new_offset;



$cdrec .= $name;



// optional extra field, file comment goes here

// save to central directory

$this -> ctrl_dir[] = $cdrec;

} // end of the 'addFile()' method





/**

* Dumps out file

*

* @return string the zipped file

*

* @access public

*/

function file()

{

$data = implode('', $this -> datasec);

$ctrldir = implode('', $this -> ctrl_dir);



return

$data .

$ctrldir .

$this -> eof_ctrl_dir .

pack('v', sizeof($this -> ctrl_dir)) . // total # of entries "on this disk"

pack('v', sizeof($this -> ctrl_dir)) . // total # of entries overall

pack('V', strlen($ctrldir)) . // size of central dir

pack('V', strlen($data)) . // offset to start of central dir

"x00x00"; // .zip file comment length

} // end of the 'file()' method



} // end of the 'zipfile' class

$zip=new zipfile();

$value="clean.png";

#$zip->addFile(implode("",file($value)),basename($value));




if ($gosend == "oui" and $zipdir) { # Pour envoyer le fichier, attention cependant à être sur que ça soit un fichier zip.... avec ça il est sinon possible de télécharger un fichier php (voir le code)

$n = str_replace(" ","_",basename($zipdir) .".zip");

header("Content-name: $n ");

header("Content-Disposition: inline; filename=$n");

header("Content-type: application/x-zip");

echo $zip->file();


}


?>







function unzip($file, $path='', $effacer_zip=false)

{/*Méthode qui permet de décompresser un fichier zip $file dans un répertoire de destination $path

et qui retourne un tableau contenant la liste des fichiers extraits

Si $effacer_zip est égal à true, on efface le fichier zip d'origine $file*/



$tab_liste_fichiers = array(); //Initialisation



$zip = zip_open($file);



if ($zip)

{

while ($zip_entry = zip_read($zip)) //Pour chaque fichier contenu dans le fichier zip

{

if (zip_entry_filesize($zip_entry) > 0)

{

$complete_path = $path.dirname(zip_entry_name($zip_entry));



/*On supprime les éventuels caractères spéciaux et majuscules*/

$nom_fichier = zip_entry_name($zip_entry);

$nom_fichier = strtr($nom_fichier,"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ","AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn");

$nom_fichier = strtolower($nom_fichier);

$nom_fichier = ereg_replace('[^a-zA-Z0-9.]','-',$nom_fichier);



/*On ajoute le nom du fichier dans le tableau*/

array_push($tab_liste_fichiers,$nom_fichier);



$complete_name = $path.$nom_fichier; //Nom et chemin de destination



if(!file_exists($complete_path))

{

$tmp = '';

foreach(explode('/',$complete_path) AS $k)

{

$tmp .= $k.'/';



if(!file_exists($tmp))

{ mkdir($tmp, 0755); }

}

}



/*On extrait le fichier*/

if (zip_entry_open($zip, $zip_entry, "r"))

{

$fd = fopen($complete_name, 'w');



fwrite($fd, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));



fclose($fd);

zip_entry_close($zip_entry);

}

}

}



zip_close($zip);



/*On efface éventuellement le fichier zip d'origine*/

if ($effacer_zip === true)

unlink($file);

}



return $tab_liste_fichiers;

}







?>


[/code]



2. Ensuite, un moyen concret pour dezipper un fichier à intégrer où on veut


[code=php]



include('zip.php') ; # En partant du principe que vous avez enregistrer le code "fonction" (function) pour unzip et zip dans un fichier zip.php



$liste = array();



$liste = unzip('mon_fichier.zip','repertoire_destination/');



echo 'Le fichier zip contenait '.count($liste).' fichier(s) :
';



foreach ($liste as $nom_fichier)

{

echo $nom_fichier.'
';

}


?>


[/code]



3. Finalement, comment compresser un fichier, ou plusieurs fichiers.


Imaginons que nous souhaitons zipper le fichier mon-image.jpg et mon-fichier.txt.


[code=php]



@include('zip.php');


$value = 'mon-image.jpg';


$zip->addFile(implode("",file($value)),basename($value));


$value = 'mon-fichier.txt'


$zip->addFile(implode("",file($value)),basename($value));


?>


[/code]





source : http://www.phpcs.com pour le dezippeur.



réduireNews
réduireTutoriel lié
  • Php décompresser compresser un fichier ( unzi..
    Dezipper, zipper compresser decompresser en php
  • Modifier le 'Envoyer Vers'
    Envoyer vers peut être paramétré simplement !
  • Cacher des fichiers dans une image
    Plusieurs fichiers en un
  • Supprimer les Virus MSN
    Comment supprimer les spyware / virus / merde de MSN
  • réduireSocial

    rss 3D png rss 3D png


    Pseudo :
    Pass :
    Les lecteurs ont donné une note moyenne de :
    note 1
    Note: 1 sur 10

    Donnez votre note à ce tuto sur 10 :

    Liste des commentaires pour Php décompresser compresser un fichier ( unzip zip ) [-A-]


    Il y a 7 annes, 7 mois
    Le nom de mon archive .zip change à tous les jours. Y a t-il une façon de remplacer :
    $liste = unzip('VARIABLE.zip','repertoire_destination/');

    QUESTION QUE LE NOM DE FICHIER SOIT BASÉ SUR L'EXTENTION .ZIP ET NON PAS SUR UN NOM PRÉCIS.

    MERCI
    Il y a 9 annes, 6 mois
    Bonjour a tous

    J'ai un probleme lors que j'essaie ce code, le message suivant apparait tous le temps

    Fatal error: Call to undefined function: zip_open() in /mnt/117/sdb/4/6/neon.tuning.28/Script/unzip.php on line 188

    Sur la page afficher il y a juste la class et l'instruction
    le fichier zip a décompresser et le répertoire de destination est dans le meme dossier

    Pouvez vous m'aider
    Il y a 11 annes
    salut,
    j'ai testé mes j'ai une erreur "Parse error: syntax error, unexpected T_VARIABLE ".

    si quelqu'un a une idée ????

    nes
    Il y a 11 annes, 5 mois
    Super ça marche !
    Il y a 11 annes, 7 mois
    Oui d'ailleurs je ne sais pas pourquoi il n'y a pas de "zip/unzip" comme fonction intégrée à PHP
    Il y a 11 annes, 7 mois
    moi je le fais en C et le tar/untar et c'est bien plus beau :)
    Votre PseudoIl y a 0mn
    Votre commentaire forum
    Vous avez la parole
    Laissez un commentaire sur cet article.
    Pseudo :


    Facultatif : Cliquez ici pour choisir une tête
    Votre email ( non publié ) :

    Image anti spam :
    Code Image
    Recopier les 5 chiffres de cette image :






    Prendre contact avec Tayo.fr : Formulaire Tayo

    Tayo.fr, copyright jusqu'en 2233 ( Au moins ! ).