How to zip a whole folder using PHP

前端 未结 15 2282
有刺的猬
有刺的猬 2020-11-22 08:48

I have found here at stackoveflow some codes on how to ZIP a specific file, but how about a specific folder?

Folder/
  index.html
  picture.jpg
  important.tx         


        
15条回答
  •  栀梦
    栀梦 (楼主)
    2020-11-22 09:13

    I found this post in google as the second top result, first was using exec :(

    Anyway, while this did not suite my needs exactly.. I decided to post an answer for others with my quick but extended version of this.

    SCRIPT FEATURES

    • Backup file naming day by day, PREFIX-YYYY-MM-DD-POSTFIX.EXTENSION
    • File Reporting / Missing
    • Previous Backups Listing
    • Does not zip / include previous backups ;)
    • Works on windows/linux

    Anyway, onto the script.. While it may look like a lot.. Remember there is excess in here.. So feel free to delete the reporting sections as needed...

    Also it may look messy as well and certain things could be cleaned up easily... So dont comment about it, its just a quick script with basic comments thrown in.. NOT FOR LIVE USE.. But easy to clean up for live use!

    In this example, it is run from a directory that is inside of the root www / public_html folder.. So only needs to travel up one folder to get to the root.

    PHP Example: ZipArchive - Mayhem

    '; // CHECK IF BACKUP ALREADY DONE if (file_exists($sFileZip)) { // IF BACKUP EXISTS... SHOW MESSAGE AND THATS IT echo "

    Backup Already Exists

    "; echo 'File Name: ',$sFileZip,'
    '; echo 'File Size: ',$sFileZip,'
    '; echo "
    "; exit; // No point loading our function below ;) } else { // NO BACKUP FOR TODAY.. SO START IT AND SHOW SCRIPT SETTINGS echo "

    Script Settings

    "; echo 'Backup Directory: ',$pathBase,'
    '; echo 'Backup Save File: ',$sFileZip,'
    '; echo "
    "; // CREATE ZIPPER AND LOOP DIRECTORY FOR SUB STUFF $oZip = new ZipArchive; $oZip->open($sFileZip, ZipArchive::CREATE | ZipArchive::OVERWRITE); $oFilesWrk = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($pathBase),RecursiveIteratorIterator::LEAVES_ONLY); foreach ($oFilesWrk as $oKey => $eFileWrk) { // VARIOUS NAMING FORMATS OF THE CURRENT FILE / DIRECTORY.. RELATE & ABSOLUTE $sFilePath = substr($eFileWrk->getPathname(),$iBaseLen, strlen($eFileWrk->getPathname())- $iBaseLen); $sFileReal = $eFileWrk->getRealPath(); $sFile = $eFileWrk->getBasename(); // WINDOWS CORRECT SLASHES $sMyFP = str_replace('\\', '/', $sFileReal); if (file_exists($sMyFP)) { // CHECK IF THE FILE WE ARE LOOPING EXISTS if ($sFile!="." && $sFile!="..") { // MAKE SURE NOT DIRECTORY / . || .. // CHECK IF FILE HAS BACKUP NAME PREFIX/POSTFIX... If So, Dont Add It,, List It if (substr($sFile,0, $iPreLen)!=$zipPREFIX && substr($sFile,-1, $iPostLen + 4)!= $zipPOSTFIX.$zipEXTENSION) { $oFiles[] = $sMyFP; // LIST FILE AS DONE $oZip->addFile($sMyFP, $sFilePath); // APPEND TO THE ZIP FILE } else { $oFiles_Previous[] = $sMyFP; // LIST PREVIOUS BACKUP } } } else { $oFiles_Error[] = $sMyFP; // LIST FILE THAT DOES NOT EXIST } } $sZipStatus = $oZip->getStatusString(); // GET ZIP STATUS $oZip->close(); // WARNING: Close Required to append files, dont delete any files before this. // SHOW BACKUP STATUS / FILE INFO echo "

    Backup Stats

    "; echo "Zipper Status: " . $sZipStatus . "
    "; echo "Finished Zip Script: ",$sFileZip,"
    "; echo "Zip Size: ",human_filesize($sFileZip),"
    "; echo "
    "; // SHOW ANY PREVIOUS BACKUP FILES echo "

    Previous Backups Count(" . count($oFiles_Previous) . ")

    "; foreach ($oFiles_Previous as $eFile) { echo basename($eFile) . ", Size: " . human_filesize($eFile) . "
    "; } echo "
    "; // SHOW ANY FILES THAT DID NOT EXIST?? if (count($oFiles_Error)>0) { echo "

    Error Files, Count(" . count($oFiles_Error) . ")

    "; foreach ($oFiles_Error as $eFile) { echo $eFile . "
    "; } echo "
    "; } // SHOW ANY FILES THAT HAVE BEEN ADDED TO THE ZIP echo "

    Added Files, Count(" . count($oFiles) . ")

    "; foreach ($oFiles as $eFile) { echo $eFile . "
    "; } echo "
    "; } // CONVERT FILENAME INTO A FILESIZE AS Bytes/Kilobytes/Megabytes,Giga,Tera,Peta function human_filesize($sFile, $decimals = 2) { $bytes = filesize($sFile); $sz = 'BKMGTP'; $factor = floor((strlen($bytes) - 1) / 3); return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor]; } ?>

    WHAT DOES IT DO??

    It will simply zip the complete contents of the variable $pathBase and store the zip in that same folder. It does a simple detection for previous backups and skips them.

    CRON BACKUP

    This script i've just tested on linux and worked fine from a cron job with using an absolute url for the pathBase.

提交回复
热议问题