Het comprimeren van bestanden bij het overbrengen via internet heeft veel voordelen. In de meeste gevallen komt de gecombineerde totale grootte van alle bestanden in het gecomprimeerde formaat neer op een mooie marge. Dit betekent dat u een deel van uw bandbreedte bespaart en dat gebruikers ook snellere downloadsnelheden krijgen. Zodra de gebruikers een bestand hebben gedownload, kunnen ze het wanneer ze maar willen decomprimeren. Kortom, compressie kan het aanbieden van bestanden via internet een stuk eenvoudiger maken voor zowel u als uw bezoekers.
Een factor die u kan ontmoedigen om bestanden te comprimeren of het proces erg vervelend te maken, is het feit dat u dit misschien handmatig doet. Gelukkig komt PHP met heel veel extensies die zich specifiek bezighouden met bestandscompressie en extractie. U kunt de functies die beschikbaar zijn in deze extensies gebruiken om automatisch bestanden in PHP te comprimeren.
In deze zelfstudie leer je hoe je zip-bestanden en uitgepakte bestanden kunt comprimeren en comprimeren van en naar een zip-archief in PHP. U leert ook hoe u bestanden in een archief kunt verwijderen of hernoemen zonder ze eerst te extraheren.
De PHP ZipArchive
klasse heeft veel eigenschappen en methoden die u kunnen helpen bij het comprimeren en decomprimeren van al uw bestanden.
U kunt één voor één bestanden aan uw zip-archief toevoegen of de hele map in één keer toevoegen. In beide gevallen is de eerste stap het maken van een nieuwe ZipArchive
bijvoorbeeld en vervolgens het open ($ filename, [$ flags])
methode. Deze methode opent een nieuw zip-archief voor lezen, schrijven of andere wijzigingen. Er zijn vier geldige waarden voor de optionele $ vlag
parameter die bepalen hoe verschillende situaties moeten worden behandeld.
ZipArchive :: OVERWRITE
-Deze vlag overschrijft de inhoud in het opgegeven archief als deze al bestaat.ZipArchive :: CREATE
-Deze vlag maakt een nieuw archief als het nog niet bestaat.ZipArchive :: EXCL
-Deze vlag resulteert in een foutmelding als het archief al bestaat.ZipArchive :: CHECKCONS
-Deze vlag geeft PHP de opdracht om extra consistentiecontroles uit te voeren op het archief en een foutmelding te geven als ze falen.U kunt de documentatie van deze methode raadplegen om meer te weten te komen over de verschillende foutcodes die worden geretourneerd als het bestand niet wordt geopend. Als het zipbestand is geopend of met succes is gemaakt, keert de methode terug waar
.
Nadat u het archief met succes hebt geopend, kunt u de addFile ($ filename, $ localname, $ start, $ length)
methode om een bestand van een bepaald pad aan uw archief toe te voegen. De $ filename
parameter is het pad van een bestand dat u aan het archief wilt toevoegen. De $ localName
parameter wordt gebruikt om een naam toe te wijzen aan het bestand om het in het archief op te slaan. Je kan bellen bestand toevoegen()
elke keer dat u een nieuw bestand aan uw archief wilt toevoegen.
Nadat u alle benodigde bestanden aan het archief hebt toegevoegd, kunt u eenvoudig het dichtbij()
methode om het te sluiten en de wijzigingen op te slaan.
Stel dat u een website heeft waarmee gebruikers lettertypebestanden voor verschillende lettertypen kunnen downloaden, samen met de licentiegegevens om deze te gebruiken. Bestanden zoals deze zijn perfecte voorbeelden van geautomatiseerde archivering met behulp van PHP. De volgende code laat zien hoe je precies dat moet doen.
open ('gecomprimeerd / font_files.zip', ZipArchive :: CREATE); $ zip-> addFile ('fonts / Monoton / Monoton-Regular.ttf', 'Monoton-Regular.ttf'); $ zip-> addFile ('fonts / Monoton / OFL.txt', 'license.txt'); $ Zip-> close (); ?>
We beginnen met het maken van een ZipArchive
bijvoorbeeld en gebruik vervolgens de Open()
methode om ons archief te maken. De bestand toevoegen()
methode voegt onze werkelijke toe .ttf lettertypebestand en de .tekst licentiebestand naar het archief.
Merk op dat de originele bestanden zich in de fonts / Monoton directory. De PHP-code plaatst het echter direct in de hoofdmap van ons archief. U kunt de directorystructuur en de namen van bestanden in het archief wijzigen.
Het toevoegen van individuele bestanden aan uw archief kan na een tijdje vermoeiend worden. U wilt bijvoorbeeld een archief van allemaal maken .pdf of .png bestanden in een map. De addGlob ($ patroon, $ vlaggen, $ opties)
methode zal in dit geval zeer nuttig zijn. Het enige nadeel van deze methode is dat u de controle verliest over de locatie van individuele bestanden in het archief. U kunt echter nog steeds de directorystructuur binnen het archief beïnvloeden met behulp van de $ options
parameter. De opties worden doorgegeven in de vorm van een associatieve array.
add_path
-De waarde die u toewijst add_path
wordt voorafgegaan door het lokale pad van het bestand in het archief.remove_path
-De waarde die u toewijst remove_path
wordt gebruikt om een overeenkomend voorvoegsel te verwijderen uit het pad van verschillende bestanden die aan het archief zijn toegevoegd.remove_all_path
-De waarde van instellen remove_all_path
naar waar
verwijdert alles behalve het pad van het bestand. In dit geval worden de bestanden toegevoegd aan de hoofdmap van het archief.Het is belangrijk om te onthouden dat het verwijderen van een pad is voltooid voordat u de waarde invoert die wordt vermeld in add_path
.
Het volgende codefragment maakt gebruik van addGlob ()
en al deze opties duidelijker.
$ zip = new ZipArchive (); $ zip-> open ('gecomprimeerd / user_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, $ opties); $ options = array ('add_path' => 'images /', 'remove_all_path' => TRUE); $ zip-> addGlob ('documents / *. jpg, png', GLOB_BRACE, $ options); $ Zip-> close ();
Zoals gewoonlijk beginnen we met het maken van een ZipArchive
instance en gebruik dan de Open()
methode om ons archief te maken. We specificeren ook verschillende waarden voor de add_path
toets in de $ options
array elke keer voordat u de addGlob ()
methode. Op deze manier kunnen we één specifieke set bestanden tegelijkertijd verwerken en dienovereenkomstig archiveringsopties bieden.
In het eerste geval herhalen we alles .jpg bestanden in de lichten map en plaats ze in de light_wallpapers map in het archief. Op dezelfde manier herhalen we alle .ttf bestanden in de documenten map en plaats ze vervolgens in een map met de naam font_files in ons archief. Ten slotte herhalen we alle .jpg en .png bestanden in onze documenten in één keer en leg ze allemaal samen in de afbeeldingen directory.
Zoals je kunt zien, zijn de waarden in de $ options
parameters zijn handig bij het organiseren van de inhoud binnen het archief.
De ZipArchive
klasse heeft een methode genaamd extractTo ($ destination, $ entries)
om de inhoud van een archief uit te pakken. Je kunt het gebruiken om alles uit het archief te extraheren of alleen bepaalde specifieke bestanden. De $ entries
parameter kan worden gebruikt om een enkele bestandsnaam op te geven die moet worden uitgepakt, of u kunt deze gebruiken om een reeks bestanden door te geven.
Een belangrijk punt om te onthouden is dat je het juiste pad van het bestand in het archief moet opgeven om het uit te pakken. We hebben bijvoorbeeld een fontbestand gearchiveerd dat is genoemd AlegreyaSans-Light.ttf in het vorige gedeelte. Het bestand is in het archief opgeslagen in een map met de naam font_files. Dit betekent dat het pad dat u moet opgeven in de $ entries
parameter zou zijn font_files / AlegreyaSans-Light.ttf en niet eenvoudig AlegreyaSans-Light.ttf.
De map en de bestandsstructuur worden tijdens het extractieproces bewaard en de bestanden worden in de respectieve mappen uitgepakt.
open ('gecomprimeerd / user_archive.zip', ZipArchive :: CREATE); $ zip-> extractTo ('uncompressed /', 'font_files / AlegreyaSans-Light.ttf'); $ Zip-> close (); ?>
Als u de tweede parameter weglaat, extraheert de methode alle bestanden in het archief.
De ZipArchive
klasse heeft ook veel andere methoden en eigenschappen om u te helpen meer informatie over het archief te krijgen voordat u de volledige inhoud ervan extraheert.
U kunt het aantal bestanden in een archief tellen met behulp van de telling ()
methode. Een andere optie is om de numFiles
eigendom. Ze kunnen worden gebruikt om alle bestanden in het archief te herhalen en alleen die uit te pakken die u nodig hebt, of u kunt iets anders met ze doen, zoals ze uit het archief verwijderen.
In het volgende voorbeeld verwijderen we alle bestanden in het archief die het woord bevatten Cursief. Een vergelijkbare code kan worden gebruikt om alle bestanden te verwijderen die geen specifiek woord bevatten. U kunt ook deze bestanden herhalen en een bepaald woord vervangen door iets anders.
open ('gecomprimeerd / user_archive.zip', ZipArchive :: CREATE); $ file_count = $ zip-> count (); voor ($ i = 0; $ i < $file_count; $i++) $file_name = $zip->getNameIndex ($ i); if (stripos ($ file_name, 'Italic')! == false) $ zip-> deleteName ($ file_name); $ zip-> close (); ?>
In de bovenstaande code gebruiken we deleteName ()
om een individueel bestand te verwijderen. U kunt het echter ook gebruiken om een volledige map te verwijderen.
Een vergelijkbare functie renameName ($ oldname, $ newname)
kan worden gebruikt om de naam van alle bestanden in het archief te wijzigen. U krijgt een foutmelding als een bestand met de naam $ newname
bestaat al.
We hebben een aantal zeer nuttige methoden van de ZipArchive
klasse die geautomatiseerde compressie en extractie van bestanden in PHP een fluitje van een cent zal maken. U zou nu individuele bestanden of een groep van hen tegelijk moeten kunnen comprimeren op basis van uw eigen criteria. Evenzo zou je een bepaald bestand uit het archief kunnen halen zonder andere inhoud te beïnvloeden.
Met de hulp van telling ()
en numFiles
, u krijgt meer controle over de afzonderlijke bestanden en het hernoemen of verwijderen ervan zou supereenvoudig zijn. U moet minstens één keer de documentatie doornemen om meer over dergelijke functies te lezen.