Comment compresser et décompresser des fichiers en PHP

Compresser des fichiers lors de leur transfert sur Internet présente de nombreux avantages. Dans la plupart des cas, la taille totale combinée de tous les fichiers au format compressé diminue de manière significative. Cela signifie que vous économiserez une partie de votre bande passante et que les utilisateurs auront également des vitesses de téléchargement plus rapides. Une fois que les utilisateurs ont téléchargé un fichier, ils peuvent le décompresser à tout moment. En bref, la compression peut faciliter grandement le traitement des fichiers sur Internet, ainsi que ceux de vos visiteurs..

Un facteur qui peut vous décourager de compresser des fichiers ou rendre le processus très fastidieux est le fait que vous le fassiez manuellement. Heureusement, PHP contient de nombreuses extensions qui traitent spécifiquement de la compression et de l’extraction de fichiers. Vous pouvez utiliser les fonctions disponibles dans ces extensions pour compresser automatiquement les fichiers en PHP.

Ce tutoriel vous apprendra comment compresser et extraire des fichiers vers et depuis une archive zip en PHP. Vous apprendrez également à supprimer ou renommer des fichiers dans une archive sans les extraire au préalable..

Compresser des fichiers en PHP

Le PHP ZipArchive la classe a beaucoup de propriétés et méthodes qui peuvent vous aider à compresser et décompresser tous vos fichiers.

Compresser des fichiers individuels

Vous pouvez ajouter des fichiers à votre archive zip un par un ou ajouter tout le répertoire à la fois. Dans les deux cas, la première étape consiste à créer un nouveau ZipArchive par exemple, puis en appelant le open ($ filename, [$ flags]) méthode. Cette méthode ouvrira une nouvelle archive zip pour la lecture, l'écriture ou d'autres modifications. Il existe quatre valeurs valides pour l'option $ flag paramètre qui détermine comment gérer différentes situations.

  • ZipArchive :: OVERWRITE-Cet indicateur écrasera le contenu de l'archive spécifiée si elle existe déjà..
  • ZipArchive :: CRÉER-Ce drapeau va créer une nouvelle archive si elle n'existe pas déjà.
  • ZipArchive :: EXCL-Cet indicateur provoquera une erreur si l'archive existe déjà..
  • ZipArchive :: CHECKCONS-Cet indicateur indiquera à PHP d'effectuer des contrôles de cohérence supplémentaires sur l'archive et générera une erreur en cas d'échec..

Vous pouvez consulter la documentation de cette méthode pour connaître les différents codes d'erreur renvoyés en cas d'échec lors de l'ouverture du fichier. Si le fichier zip a été ouvert ou créé avec succès, la méthode retournera vrai.

Une fois que vous avez ouvert l'archive avec succès, vous pouvez utiliser le addFile ($ filename, $ localname, $ start, $ length) méthode pour ajouter n’importe quel fichier d’un chemin donné à votre archive. le $ filename paramètre est le chemin d'un fichier que vous souhaitez ajouter à l'archive. le $ localname Le paramètre est utilisé pour attribuer un nom au fichier afin de le stocker à l'intérieur de l'archive. Tu peux appeler ajouter le fichier() chaque fois que vous souhaitez ajouter un nouveau fichier à votre archive.

Après avoir ajouté tous les fichiers nécessaires à l’archive, vous pouvez simplement appeler le Fermer() méthode pour le fermer et enregistrer les modifications.

Supposons que vous disposiez d'un site Web permettant aux utilisateurs de télécharger des fichiers de polices pour différentes polices, ainsi que les informations relatives à la licence d'utilisation. Des fichiers comme ceux-ci seront des exemples parfaits d'archivage automatisé utilisant PHP. Le code suivant vous montre comment faire exactement cela.

open ('compressé / font_files.zip', ZipArchive :: CREATE); $ zip-> addFile ('polices / Monoton / Monoton-Regular.ttf', 'Monoton-Regular.ttf'); $ zip-> addFile ('polices / Monoton / OFL.txt', 'license.txt'); $ zip-> close (); ?>

Nous commençons par créer un ZipArchive par exemple, puis en utilisant le ouvrir() méthode pour créer nos archives. le ajouter le fichier() méthode ajoute notre réelle .ttf fichier de police et le .SMS fichier de licence aux archives.

Notez que les fichiers originaux se trouvaient à l’intérieur du polices / Monoton annuaire. Cependant, le code PHP le place directement à la racine de notre archive. Vous pouvez modifier la structure des répertoires ainsi que les noms des fichiers contenus dans les archives..

Compression de plusieurs fichiers d'un répertoire

Ajouter des fichiers individuels à vos archives peut devenir fatiguant après un certain temps. Par exemple, vous voudrez peut-être créer une archive de tous les .pdf ou .png fichiers dans un répertoire. le addGlob ($ pattern, $ flags, $ options) Cette méthode s'avérera très utile dans ce cas. Le seul inconvénient de cette méthode est que vous perdez le contrôle de l'emplacement des fichiers individuels dans les archives. Cependant, vous pouvez toujours influencer la structure des répertoires à l’intérieur de l’archive en utilisant le $ options paramètre. Les options sont passées sous la forme d'un tableau associatif.

  • add_path-La valeur que vous attribuez add_path est préfixé au chemin local du fichier dans l'archive.
  • remove_path-La valeur que vous attribuez remove_path est utilisé pour supprimer un préfixe correspondant du chemin de différents fichiers ajoutés à l'archive.
  • remove_all_path-Définir la valeur de remove_all_path à vrai supprime tout du chemin du fichier en plus de son nom. Dans ce cas, les fichiers sont ajoutés à la racine de l'archive..

Il est important de se rappeler que la suppression d'un chemin est effectuée avant de préfixer la valeur spécifiée dans add_path.

L'extrait de code suivant rend l'utilisation de addGlob () et toutes ces options plus claires.

$ zip = new ZipArchive (); $ zip-> open ('compressé / utilisateur_archive.zip', ZipArchive :: CREATE); $ options = array ('add_path' => 'light_wallpapers /', 'remove_all_path' => TRUE); $ zip-> addGlob ('lights / *. jpg', 0, $ options); $ options = array ('add_path' => 'font_files /', 'remove_all_path' => TRUE); $ zip-> addGlob ('documents / *. ttf', 0, $ options); $ options = array ('add_path' => 'pdf_books /', 'remove_all_path' => TRUE); $ zip-> addGlob ('documents / *. pdf', 0, $ options); $ options = array ('add_path' => 'images /', 'remove_all_path' => TRUE); $ zip-> addGlob ('documents / *. jpg, png', GLOB_BRACE, $ options); $ zip-> close ();

Comme d’habitude, on commence par créer un ZipArchive par exemple, puis utilisez le ouvrir() méthode pour créer nos archives. Nous spécifions également différentes valeurs pour le add_path clé dans le $ options tableau à chaque fois avant d'appeler le addGlob () méthode. De cette manière, nous pouvons traiter un ensemble de fichiers spécifique à la fois et fournir des options d'archivage en conséquence..

Dans le premier cas, nous parcourons tout .jpg fichiers dans le lumières répertoire et placez-les dans le light_wallpapers répertoire dans l'archive. De même, nous parcourons tous les .ttf fichiers dans le des documents répertoire et ensuite les mettre dans un dossier appelé font_files dans nos archives. Enfin, nous parcourons tous les .jpg et .png fichiers dans nos documents à la fois et les mettre tous ensemble dans le images annuaire.

Comme vous pouvez le voir, les valeurs dans le $ options les paramètres sont utiles pour organiser le contenu à l'intérieur de l'archive.

Extraire le contenu d'une archive

le ZipArchive la classe a une méthode appelée extractTo ($ destination, $ entrées) extraire le contenu d'une archive. Vous pouvez l'utiliser pour extraire tout ce qui se trouve dans l'archive ou juste quelques fichiers spécifiques. le $ entrées paramètre peut être utilisé pour spécifier un seul nom de fichier à extraire, ou vous pouvez l'utiliser pour transmettre un tableau de fichiers.

Un point important à retenir est que vous devez spécifier le chemin correct du fichier à l'intérieur de l'archive afin de l'extraire. Par exemple, nous avons archivé un fichier de police appelé AlegreyaSans-Light.ttf dans la section précédente. Le fichier était stocké dans l’archive dans un répertoire appelé font_files. Cela signifie que le chemin que vous devez spécifier dans le $ entrées paramètre serait font_files / AlegreyaSans-Light.ttf et pas simplement AlegreyaSans-Light.ttf.

Le répertoire et la structure de fichiers seront préservés pendant le processus d'extraction et les fichiers seront extraits dans leurs répertoires respectifs.

open ('compressé / utilisateur_archive.zip', ZipArchive :: CREATE); $ zip-> extractTo ('uncompressed /', 'font_files / AlegreyaSans-Light.ttf'); $ zip-> close (); ?>

Si vous omettez le deuxième paramètre, la méthode extraira tous les fichiers de l'archive..

Obtenez plus de contrôle sur les archives

le ZipArchive La classe a également beaucoup d'autres méthodes et propriétés pour vous aider à obtenir plus d'informations sur l'archive avant d'extraire tout son contenu..

Vous pouvez compter le nombre de fichiers d’une archive à l’aide du bouton compter() méthode. Une autre option consiste à utiliser le numFiles propriété. Ils peuvent être utilisés pour parcourir tous les fichiers de l'archive et extraire uniquement ceux dont vous avez besoin - ou vous pouvez faire autre chose avec eux, comme les supprimer de l'archive..

Dans l’exemple suivant, nous supprimons tous les fichiers de l’archive contenant le mot Italique. Un code similaire pourrait être utilisé pour supprimer tous les fichiers qui ne contiennent pas un mot spécifique. Vous pouvez également parcourir ces fichiers et remplacer un mot particulier par autre chose.

open ('compressé / utilisateur_archive.zip', ZipArchive :: CREATE); $ file_count = $ zip-> count (); pour ($ i = 0; $ i < $file_count; $i++)  $file_name = $zip->getNameIndex ($ i); if (stripos ($ nom_fichier, 'Italique')! == false) $ zip-> deleteName ($ nom_fichier);  $ zip-> close (); ?>

Dans le code ci-dessus, nous utilisons deleteName () supprimer un fichier individuel. Cependant, vous pouvez également l'utiliser pour supprimer un répertoire entier.

Une fonction similaire renameName ($ oldname, $ newname) peut être utilisé pour changer le nom de n'importe quel fichier de l'archive. Vous obtiendrez une erreur si un fichier intitulé $ newname existe déjà.

Dernières pensées

Nous avons couvert un tas de méthodes très utiles de la ZipArchive classe qui facilitera la compression et l’extraction automatisées de fichiers en PHP. Vous devriez maintenant pouvoir compresser des fichiers individuels ou un groupe d’eux à la fois, en fonction de vos propres critères. De même, vous devriez pouvoir extraire un fichier particulier de l’archive sans affecter d’autres contenus..

Avec l'aide de compter() et numFiles, vous obtiendrez plus de contrôle sur les fichiers individuels et il serait très facile de les renommer ou de les supprimer. Vous devriez parcourir la documentation au moins une fois pour en savoir plus sur ces fonctions..