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
  • Dans la même catégorie : Php Mysql

    Quand Wamp vous affiche que des messages Forbidden

    Passer l'activation de Windows 7 temporairement avec invite de commande
    réduireSocial

    rss 3D png rss 3D png


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

    Donnez votre note à ce tuto sur 10 :

    Script pour charger une publicité une fois que la page web est en place

    Comment changer du texte dans toute une base de donnée mysql

    Quand Wamp vous affiche que des messages Forbidden

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


    Il y a 5 années, 10 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 7 années, 9 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 9 années, 3 mois
    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 9 années, 8 mois
    Super ça marche !
    Il y a 9 années, 10 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 9 années, 10 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 ! ).