কীভাবে পিএইচপি ব্যবহার করে পুরো ফোল্ডারটি জিপ করবেন


131

একটি সুনির্দিষ্ট ফাইলটি কীভাবে জিপ করা যায় সে সম্পর্কে আমি কিছু কোড স্ট্যাকোভ্লোতে পেয়েছি, তবে একটি নির্দিষ্ট ফোল্ডারটি কীভাবে?

Folder/
  index.html
  picture.jpg
  important.txt

ভিতরে ভিতরে My Folder, ফাইল আছে। জিপ করার পরে My Folder, আমি বাদে ফোল্ডারের পুরো সামগ্রীটি মুছতে চাই important.txt

এটি স্ট্যাকের এখানে পেয়েছি

আমার তোমার সাহায্য দরকার ধন্যবাদ।


আমি যতদূর দেখতে পাচ্ছি, আপনার দেওয়া স্ট্যাকওভারফ্লো লিঙ্কটি আসলে একাধিক ফাইলগুলিকে জিপ করে। কোন অংশ নিয়ে আপনার সমস্যা আছে?
ল্যাসে এসপল্ট

@lasseespholt এই লিঙ্কটি আমি আপনাকে একটি নির্দিষ্ট ফাইল
জিপগুলি দিয়েছি

তিনি ফাইলগুলির একটি অ্যারে নেন (মূলত একটি ফোল্ডার) এবং সমস্ত ফাইলগুলি জিপ ফাইলে (লুপ) যুক্ত করেন। আমি দেখতে পাচ্ছি যে সূক্ষ্ম উত্তরটি এখন পোস্ট করা হয়েছে +1 :) যা একই কোড, অ্যারে এখন কেবল একটি ডিরেক্টরি থেকে ফাইলগুলির একটি তালিকা।
ল্যাসে এসপোল্ট


এই আপনাকে সহায়তা করতে পারে codingbin.com/compressing-a-directory-of-files-with-php
ম্যাসেডোনিয়ানে

উত্তর:


320

কোড আপডেট হয়েছে 2015/04/22।

একটি সম্পূর্ণ ফোল্ডার জিপ করুন:

// Get real path for our folder
$rootPath = realpath('folder-to-zip');

// Initialize archive object
$zip = new ZipArchive();
$zip->open('file.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);

// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($rootPath),
    RecursiveIteratorIterator::LEAVES_ONLY
);

foreach ($files as $name => $file)
{
    // Skip directories (they would be added automatically)
    if (!$file->isDir())
    {
        // Get real and relative path for current file
        $filePath = $file->getRealPath();
        $relativePath = substr($filePath, strlen($rootPath) + 1);

        // Add current file to archive
        $zip->addFile($filePath, $relativePath);
    }
}

// Zip archive will be created only after closing object
$zip->close();

একটি সম্পূর্ণ ফোল্ডারে জিপ করুন + "গুরুত্বপূর্ণ.txt" ব্যতীত সমস্ত ফাইল মুছুন:

// Get real path for our folder
$rootPath = realpath('folder-to-zip');

// Initialize archive object
$zip = new ZipArchive();
$zip->open('file.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);

// Initialize empty "delete list"
$filesToDelete = array();

// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($rootPath),
    RecursiveIteratorIterator::LEAVES_ONLY
);

foreach ($files as $name => $file)
{
    // Skip directories (they would be added automatically)
    if (!$file->isDir())
    {
        // Get real and relative path for current file
        $filePath = $file->getRealPath();
        $relativePath = substr($filePath, strlen($rootPath) + 1);

        // Add current file to archive
        $zip->addFile($filePath, $relativePath);

        // Add current file to "delete list"
        // delete it later cause ZipArchive create archive only after calling close function and ZipArchive lock files until archive created)
        if ($file->getFilename() != 'important.txt')
        {
            $filesToDelete[] = $filePath;
        }
    }
}

// Zip archive will be created only after closing object
$zip->close();

// Delete all files from "delete list"
foreach ($filesToDelete as $file)
{
    unlink($file);
}

2
আপনাকে ডিআইএম (যেখানে এই স্ক্রিপ্টটি অবস্থিত) তে chmod (লিখনযোগ্য) স্থাপন করতে হবে 77 /।
দাদোর

3
কল করার আগে ফাইলগুলি মুছে ফেলা কার্যকর $zip->close()হবে না। আমার উত্তর এখানে দেখুন
hek2mgl

10
@ আলনাসার এই প্রশ্ন থেকে প্রয়োজনীয়: "আমি গুরুত্বপূর্ণ.txt ব্যতীত ফোল্ডারের পুরো সামগ্রীও মুছতে চাই"। এছাড়াও কোডটি কার্যকর করার আগে আপনাকে সর্বদা কোড পড়ার পরামর্শ দিচ্ছি।
দাদোর

1
@ অলসনে হাহাহাহাহা ... দুঃখিত :) ... হাহাহা
ওন্দ্রেজ রাফাজ

1
@ নিক-নিউম্যান, হ্যাঁ, শতাংশ গণনা করার জন্য আপনি লুপের অভ্যন্তরে php.net/manual/ru/function.iterator-count.php + কাউন্টার ব্যবহার করতে পারেন । : - কম্প্রেশন স্তর সংক্রান্ত এটা সম্ভব ZipArchive সঙ্গে এই মুহূর্তে এর stackoverflow.com/questions/1833168/...
Dador

54

জিপআরচাইভ শ্রেণিতে একটি দরকারী অননুমোদিত পদ্ধতি রয়েছে: অ্যাডগ্লোব ();

$zipFile = "./testZip.zip";
$zipArchive = new ZipArchive();

if ($zipArchive->open($zipFile, (ZipArchive::CREATE | ZipArchive::OVERWRITE)) !== true)
    die("Failed to create archive\n");

$zipArchive->addGlob("./*.txt");
if ($zipArchive->status != ZIPARCHIVE::ER_OK)
    echo "Failed to write files to zip\n";

$zipArchive->close();

এখন নথিভুক্ত: www.php.net/manual/en/ziparchive.addglob.php


2
@ নেটকোডার - এটি পরীক্ষার জন্য পিএইচপিটি লেখার সুবিধাগুলি ... মূলত, জিপআর্কাইভ শ্রেণীর উত্সের মাধ্যমে পড়ুন এবং এটি সেখানে খুঁজে পেয়েছেন .... এছাড়াও একটি অনির্ধারিত অ্যাডপ্যাটার্ন () পদ্ধতি রয়েছে যা একটি রেজিপেক্স স্টাইল প্যাটার্ন গ্রহণ করে, তবে আমি কখনই সে কাজটি পরিচালনা করতে পারি নি (ক্লাসে কোনও বাগ হতে পারে)
মার্ক বাকের

1
@ ক্রেড - আপনি যে কোনও ফাইল তালিকার সাথে এটি গ্লোব () ব্যবহার করে উত্তোলন করা যেতে পারে তা ব্যবহার করতে পারেন, সুতরাং এটি আবিষ্কার করার পরে আমি এটি অত্যন্ত কার্যকর পেয়েছি।
মার্ক বাকের

@ মার্কবেকার আমি জানি আপনার মন্তব্য পোস্ট করার কয়েক বছর পরে এই মন্তব্যটি আসবে, আমি এখানে আমার ভাগ্য চেষ্টা করছি। আমি এখানে জিপিং সম্পর্কে একটি প্রশ্ন পোস্ট করেছি । আপনি এখানে পোস্ট করা গ্লোব পদ্ধতিটি আমি চেষ্টা করতে চলেছি, তবে আমার মূল সমস্যাটি হ'ল আমি অ্যাডফ্র্যামস্ট্রিং ব্যবহার করতে পারি না, এবং অ্যাডফিল ব্যবহার করছি যা নিঃশব্দে ব্যর্থ হচ্ছে। আপনার সম্ভবত কোনও ধারণা আছে যা ভুল হতে পারে, বা আমি কী ভুল করছি?
স্কাইটিগার

@ ইউজার 1032531 - আমার পোস্টের শেষ লাইনটি (13 ই ডিসেম্বর 2013 সম্পাদিত) ডক্স পৃষ্ঠার লিঙ্ক সহ ঠিক এটিই নির্দেশ করে
মার্ক বাকের

6
কি addGlobরিকার্সিভ?
ভিনসেন্ট পোইয়েরিয়ার

20

এটা চেষ্টা কর:

$zip = new ZipArchive;
$zip->open('myzip.zip', ZipArchive::CREATE);
foreach (glob("target_folder/*") as $file) {
    $zip->addFile($file);
    if ($file != 'target_folder/important.txt') unlink($file);
}
$zip->close();

যদিও এটি পুনরাবৃত্তভাবে জিপ করবে না


এটি অবশ্যই কিছু ফাইল মুছে My folderMy folderMy folder
ফেলবে

@ স্টিফাই: if (!is_dir($file) && $file != 'target_folder...')পরিবর্তে চেষ্টা করুন। অথবা আপনি যদি পুনরাবৃত্তভাবে জিপ করতে চান তবে @ ক্রেডের উত্তরটি পরীক্ষা করুন , এটি সবচেয়ে কার্যকর উপায়।
নেটকোডার

এর মধ্যে থাকা ফোল্ডারটি My folderএখনও মুছে ফেলা হয়নি তবে যাইহোক আর কোনও ত্রুটি নেই।
উইন্ডিনানা

আমি উল্লেখ করতে ভুলে গেছি যে আমি কোনও .zip ফাইল তৈরি করেনি।
উইন্ডিনানা

1
কল করার আগে ফাইলগুলি মুছে ফেলা কার্যকর $zip->close()হবে না। আমার উত্তর এখানে দেখুন
hek2mgl

19

আমি ধরে নিলাম এটি সার্ভারে চলছে যেখানে জিপ অ্যাপ্লিকেশন অনুসন্ধানের পথে রয়েছে। সমস্ত ইউনিক্স-ভিত্তিক সত্য হওয়া উচিত এবং আমি বেশিরভাগ উইন্ডোজ-ভিত্তিক সার্ভারগুলি অনুমান করি।

exec('zip -r archive.zip "My folder"');
unlink('My\ folder/index.html');
unlink('My\ folder/picture.jpg');

সংরক্ষণাগারটি সংরক্ষণাগার। জীপে পরে থাকবে। মনে রাখবেন যে ফাইল বা ফোল্ডারের নাম ফাঁকা হওয়া ত্রুটিগুলির একটি সাধারণ কারণ এবং যেখানে সম্ভব সেখানে এড়ানো উচিত।


15

আমি নীচের কোডটি দিয়ে চেষ্টা করেছি এবং এটি কাজ করছে। কোডটি স্ব-বর্ণনামূলক, আপনার কোনও প্রশ্ন থাকলে দয়া করে আমাকে জানান।

<?php
class FlxZipArchive extends ZipArchive 
{
 public function addDir($location, $name) 
 {
       $this->addEmptyDir($name);
       $this->addDirDo($location, $name);
 } 
 private function addDirDo($location, $name) 
 {
    $name .= '/';
    $location .= '/';
    $dir = opendir ($location);
    while ($file = readdir($dir))
    {
        if ($file == '.' || $file == '..') continue;
        $do = (filetype( $location . $file) == 'dir') ? 'addDir' : 'addFile';
        $this->$do($location . $file, $name . $file);
    }
 } 
}
?>

<?php
$the_folder = '/path/to/folder/to/be/zipped';
$zip_file_name = '/path/to/zip/archive.zip';
$za = new FlxZipArchive;
$res = $za->open($zip_file_name, ZipArchive::CREATE);
if($res === TRUE) 
{
    $za->addDir($the_folder, basename($the_folder));
    $za->close();
}
else{
echo 'Could not create a zip archive';
}
?>

দুর্দান্ত সমাধান। এটি লারাভেল 5.5 এও কাজ করে। সত্যিই এটি পছন্দ করেছে। (y)
ওয়েব কারিগর

1
দুর্দান্ত কোড! পরিষ্কার, সহজ এবং পুরোপুরি কাজ! ;) এটি আমার কাছে সেরা উত্তর বলে মনে হচ্ছে। যদি এটি কাউকে সহায়তা করতে পারে: আমি ini_set('memory_limit', '512M');স্ক্রিপ্টটি কার্যকর করার আগে এবং ini_restore('memory_limit');শেষে যুক্ত করেছি। ভারী ফোল্ডারগুলির ক্ষেত্রে মেমরির অভাব এড়ানো প্রয়োজন ছিল (এটি 500MB এর চেয়ে বড় ফোল্ডার ছিল)।
জ্যাকোপো পেস

1
আমার পরিবেশে (পিএইচপি 7.3, দেবিয়ান) ডিরেক্টরি তালিকা ছাড়াই একটি জিপ সংরক্ষণাগার তৈরি করা হয়েছিল (বড়, খালি ফাইল)। আমাকে নিম্নলিখিত লাইনটি পরিবর্তন করতে হয়েছিল: $ নাম। = '/'; $ নাম = ($ নাম == '।'? '?' ': $ নাম।' / ');
গিফ্রিড

এটি আমার জন্য কাজ করছে। ভাগ করে নেওয়ার জন্য ধন্যবাদ. চিয়ার্স!
সাথিস্কা

8

এটি এমন একটি ফাংশন যা একটি পুরো ফোল্ডার এবং এর বিষয়বস্তুগুলিকে একটি জিপ ফাইলে জিপ করে এবং আপনি এটিকে সহজভাবে ব্যবহার করতে পারেন:

addzip ("path/folder/" , "/path2/folder.zip" );

ফাংশন:

// compress all files in the source directory to destination directory 
    function create_zip($files = array(), $dest = '', $overwrite = false) {
    if (file_exists($dest) && !$overwrite) {
        return false;
    }
    if (($files)) {
        $zip = new ZipArchive();
        if ($zip->open($dest, $overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
            return false;
        }
        foreach ($files as $file) {
            $zip->addFile($file, $file);
        }
        $zip->close();
        return file_exists($dest);
    } else {
        return false;
    }
}

function addzip($source, $destination) {
    $files_to_zip = glob($source . '/*');
    create_zip($files_to_zip, $destination);
    echo "done";
}

কীভাবে সাব-ফোল্ডারগুলিকে এই স্ক্রিপ্টের সাথে স্বয়ংক্রিয়ভাবে ব্যাকআপে অন্তর্ভুক্ত করা যায়? @ অ্যালিরেজা
ফ্লো কোডার

2

কেন ইএফএস পিএইচপি-জিপ মাল্টিভোলিউম স্ক্রিপ্ট চেষ্টা করবেন না ... আমি কয়েকশ জিগ এবং কয়েক মিলিয়ন ফাইল জিপ করে হস্তান্তর করেছি ... কার্যকরভাবে সংরক্ষণাগারগুলি তৈরি করার জন্য এসএসএস প্রয়োজন।

তবে আমি বিশ্বাস করি যে ফলস্বরূপ ফাইলগুলি সরাসরি পিএইচপি থেকে এক্সিকিউটের সাথে ব্যবহার করা যেতে পারে:

exec('zip -r backup-2013-03-30_0 . -i@backup-2013-03-30_0.txt');

আমি জানি না এটি কাজ করে কিনা। আমি চেষ্টা করিনি ...

"গোপনীয়তা" হ'ল আর্কাইভের কার্যকর করার সময় পিএইচপি কোড কার্যকর করার জন্য অনুমোদিত সময়ের চেয়ে বেশি হওয়া উচিত নয়।


1

এটি পিএইচপি-তে জিপ তৈরির একটি কার্যকরী উদাহরণ:

$zip = new ZipArchive();
$zip_name = time().".zip"; // Zip name
$zip->open($zip_name,  ZipArchive::CREATE);
foreach ($files as $file) {
  echo $path = "uploadpdf/".$file;
  if(file_exists($path)){
  $zip->addFromString(basename($path),  file_get_contents($path));---This is main function  
  }
  else{
   echo"file does not exist";
  }
}
$zip->close();

1

আমি গুগলে এই পোস্টটি দ্বিতীয় শীর্ষ ফলাফল হিসাবে পেয়েছি, প্রথমে এক্সিকিউটিভ ব্যবহার করছিলাম :(

যাইহোক, যদিও এটি আমার প্রয়োজনগুলি যথাযথভাবে স্যুট করে না .. আমি আমার এই দ্রুত কিন্তু বর্ধিত সংস্করণ সহ অন্যদের জন্য একটি উত্তর পোস্ট করার সিদ্ধান্ত নিয়েছি।

স্ক্রিপ্ট বৈশিষ্ট্য

  • দিনে দিনে ব্যাকআপ ফাইলের নামকরণ, প্রিফিক্স-ওয়াইওয়াই-এমএম-ডিডি-পোষ্টফিক্স.অ্যাক্টেনশন
  • ফাইল প্রতিবেদন / নিখোঁজ
  • পূর্ববর্তী ব্যাকআপ তালিকা
  • পূর্ববর্তী ব্যাকআপগুলিকে জিপ / অন্তর্ভুক্ত করে না;)
  • উইন্ডোজ / লিনাক্সে কাজ করে

যাইহোক, স্ক্রিপ্টের উপরে .. যদিও এটি দেখতে অনেকটা দেখাচ্ছে .. মনে রাখবেন এখানে আরও কিছু আছে .. সুতরাং প্রয়োজন অনুসারে রিপোর্টিং বিভাগগুলি মুছতে দ্বিধা বোধ করবেন ...

এছাড়াও এটি অগোছালো দেখাচ্ছে এবং কিছু জিনিস সহজেই পরিষ্কার করা যেতে পারে ... সুতরাং এটি সম্পর্কে মন্তব্য করবেন না, এটি কেবলমাত্র একটি প্রাথমিক স্ক্রিপ্ট যা বেসিক মন্তব্যগুলিতে ফেলেছে .. লাইভ ব্যবহারের জন্য নয় .. তবে লাইভ ব্যবহারের জন্য পরিষ্কার করা সহজ !

এই উদাহরণস্বরূপ, এটি রুট www / public_html ফোল্ডারের অভ্যন্তরে থাকা ডিরেক্টরি থেকে চালিত হয় .. সুতরাং রুটে যাওয়ার জন্য কেবল একটি ফোল্ডার ভ্রমণ করতে হবে।

<?php
    // DIRECTORY WE WANT TO BACKUP
    $pathBase = '../';  // Relate Path

    // ZIP FILE NAMING ... This currently is equal to = sitename_www_YYYY_MM_DD_backup.zip 
    $zipPREFIX = "sitename_www";
    $zipDATING = '_' . date('Y_m_d') . '_';
    $zipPOSTFIX = "backup";
    $zipEXTENSION = ".zip";

    // SHOW PHP ERRORS... REMOVE/CHANGE FOR LIVE USE
    ini_set('display_errors',1);
    ini_set('display_startup_errors',1);
    error_reporting(-1);




// ############################################################################################################################
//                                  NO CHANGES NEEDED FROM THIS POINT
// ############################################################################################################################

    // SOME BASE VARIABLES WE MIGHT NEED
    $iBaseLen = strlen($pathBase);
    $iPreLen = strlen($zipPREFIX);
    $iPostLen = strlen($zipPOSTFIX);
    $sFileZip = $pathBase . $zipPREFIX . $zipDATING . $zipPOSTFIX . $zipEXTENSION;
    $oFiles = array();
    $oFiles_Error = array();
    $oFiles_Previous = array();

    // SIMPLE HEADER ;)
    echo '<center><h2>PHP Example: ZipArchive - Mayhem</h2></center>';

    // CHECK IF BACKUP ALREADY DONE
    if (file_exists($sFileZip)) {
        // IF BACKUP EXISTS... SHOW MESSAGE AND THATS IT
        echo "<h3 style='margin-bottom:0px;'>Backup Already Exists</h3><div style='width:800px; border:1px solid #000;'>";
            echo '<b>File Name: </b>',$sFileZip,'<br />';
            echo '<b>File Size: </b>',$sFileZip,'<br />';
        echo "</div>";
        exit; // No point loading our function below ;)
    } else {

        // NO BACKUP FOR TODAY.. SO START IT AND SHOW SCRIPT SETTINGS
        echo "<h3 style='margin-bottom:0px;'>Script Settings</h3><div style='width:800px; border:1px solid #000;'>";
            echo '<b>Backup Directory: </b>',$pathBase,'<br /> ';
            echo '<b>Backup Save File: </b>',$sFileZip,'<br />';
        echo "</div>";

        // 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 "<h3 style='margin-bottom:0px;'>Backup Stats</h3><div style='width:800px; height:120px; border:1px solid #000;'>";
            echo "<b>Zipper Status: </b>" . $sZipStatus . "<br />";
            echo "<b>Finished Zip Script: </b>",$sFileZip,"<br />";
            echo "<b>Zip Size: </b>",human_filesize($sFileZip),"<br />";
        echo "</div>";


        // SHOW ANY PREVIOUS BACKUP FILES
        echo "<h3 style='margin-bottom:0px;'>Previous Backups Count(" . count($oFiles_Previous) . ")</h3><div style='overflow:auto; width:800px; height:120px; border:1px solid #000;'>";
        foreach ($oFiles_Previous as $eFile) {
            echo basename($eFile) . ", Size: " . human_filesize($eFile) . "<br />";
        }
        echo "</div>";

        // SHOW ANY FILES THAT DID NOT EXIST??
        if (count($oFiles_Error)>0) {
            echo "<h3 style='margin-bottom:0px;'>Error Files, Count(" . count($oFiles_Error) . ")</h3><div style='overflow:auto; width:800px; height:120px; border:1px solid #000;'>";
            foreach ($oFiles_Error as $eFile) {
                echo $eFile . "<br />";
            }
            echo "</div>";
        }

        // SHOW ANY FILES THAT HAVE BEEN ADDED TO THE ZIP
        echo "<h3 style='margin-bottom:0px;'>Added Files, Count(" . count($oFiles) . ")</h3><div style='overflow:auto; width:800px; height:120px; border:1px solid #000;'>";
        foreach ($oFiles as $eFile) {
            echo $eFile . "<br />";
        }
        echo "</div>";

    }


    // 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];
    }
?>

এটার কাজ কি??

এটি কেবলমাত্র ভেরিয়েবল - পাথবেসের সম্পূর্ণ সামগ্রী জিপ করে এবং একই ফোল্ডারে জিপটি সংরক্ষণ করবে। এটি পূর্ববর্তী ব্যাকআপগুলির জন্য একটি সাধারণ সনাক্তকরণ করে এবং এগুলি এড়িয়ে যায়।

ক্রোন ব্যাকআপ

এই স্ক্রিপ্টটি আমি সবেমাত্র লিনাক্সে পরীক্ষা করেছি এবং পাথবেসের জন্য একটি পরম ইউআরএল ব্যবহার করে ক্রোন জব থেকে দুর্দান্ত কাজ করেছি।


আমি মুছে ফেলুন স্ক্রিপ্টটিও বাদ দিয়েছি, আপনি এর জন্য গৃহীত উত্তর দেখতে পারেন
ক্ষুব্ধ 84

কেন সেগুলি ব্যাখ্যা না করে কোনও মন্তব্য ছাড়াই এই র্যান্ডম ডাউন ভোটগুলিকে পছন্দ করবে।
ক্রুদ্ধ 84

1

এই ফাংশনটি ব্যবহার করুন:

function zip($source, $destination)
{
    if (!extension_loaded('zip') || !file_exists($source)) {
        return false;
    }

    $zip = new ZipArchive();
    if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
        return false;
    }

    $source = str_replace('\\', '/', realpath($source));

    if (is_dir($source) === true) {
        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

        foreach ($files as $file) {
            $file = str_replace('\\', '/', $file);

            // Ignore "." and ".." folders
            if (in_array(substr($file, strrpos($file, '/')+1), array('.', '..'))) {
                continue;
            }               

            $file = realpath($file);

            if (is_dir($file) === true) {
                $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
            } elseif (is_file($file) === true) {
                $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
            }
        }
    } elseif (is_file($source) === true) {
        $zip->addFromString(basename($source), file_get_contents($source));
    }

    return $zip->close();
}

উদাহরণ ব্যবহার:

zip('/folder/to/compress/', './compressed.zip');

1

এটি ভাল কাজ করছে ব্যবহার করুন।

$dir = '/Folder/';
$zip = new ZipArchive();
$res = $zip->open(trim($dir, "/") . '.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);
if ($res === TRUE) {
    foreach (glob($dir . '*') as $file) {
        $zip->addFile($file, basename($file));
    }
    $zip->close();
} else {
    echo 'Failed to create to zip. Error: ' . $res;
}

1

পিএইচপি-তে একটি জিপ ফোল্ডার তৈরি করুন।

জিপ তৈরি পদ্ধতি

   public function zip_creation($source, $destination){
    $dir = opendir($source);
    $result = ($dir === false ? false : true);

    if ($result !== false) {

        
        $rootPath = realpath($source);
         
        // Initialize archive object
        $zip = new ZipArchive();
        $zipfilename = $destination.".zip";
        $zip->open($zipfilename, ZipArchive::CREATE | ZipArchive::OVERWRITE );
         
        // Create recursive directory iterator
        /** @var SplFileInfo[] $files */
        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($rootPath), RecursiveIteratorIterator::LEAVES_ONLY);
         
        foreach ($files as $name => $file)
        {
            // Skip directories (they would be added automatically)
            if (!$file->isDir())
            {
                // Get real and relative path for current file
                $filePath = $file->getRealPath();
                $relativePath = substr($filePath, strlen($rootPath) + 1);
         
                // Add current file to archive
                $zip->addFile($filePath, $relativePath);
            }
        }
         
        // Zip archive will be created only after closing object
        $zip->close();
        
        return TRUE;
    } else {
        return FALSE;
    }


}

জিপ পদ্ধতিতে কল করুন

$source = $source_directory;
$destination = $destination_directory;
$zipcreation = $this->zip_creation($source, $destination);

0

স্ক্রিপ্টে কিছুটা ছোট উন্নতি করেছি।

  <?php
    $directory = "./";
    //create zip object
    $zip = new ZipArchive();
    $zip_name = time().".zip";
    $zip->open($zip_name,  ZipArchive::CREATE);
    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($directory),
        RecursiveIteratorIterator::LEAVES_ONLY
    );
    foreach ($files as $file) {
        $path = $file->getRealPath();
        //check file permission
        if(fileperms($path)!="16895"){
            $zip->addFromString(basename($path),  file_get_contents($path)) ;
            echo "<span style='color:green;'>{$path} is added to zip file.<br /></span> " ;
        }
        else{
            echo"<span style='color:red;'>{$path} location could not be added to zip<br /></span>";
        }
    }
    $zip->close();
    ?>

এটি ফাইলগুলিকে জিপ করে তবে ডিরেক্টরি তালিকাটি চলে গেছে এটির আর কোনও ডিরেক্টরি নেই
সুজয় শ্রীধর

0

এটি আপনার সমস্যার সমাধান করবে। এটি চেষ্টা করুন।

$zip = new ZipArchive;
$zip->open('testPDFZip.zip', ZipArchive::CREATE);
foreach (glob(APPLICATION_PATH."pages/recruitment/uploads/test_pdf_folder/*") as $file) {
    $new_filename = end(explode("/",$file));
    $zip->addFile($file,"emp/".$new_filename);
}           
$zip->close();

0

যে কেউ এই পোস্টটি পড়ছেন এবং কেন অ্যাডফ্র্যামস্ট্রিংয়ের পরিবর্তে অ্যাডফায়ার ব্যবহার করে ফাইলগুলি জিপ করবেন এমন সন্ধান করছেন, এটি তাদের নিখুঁত পথ দিয়ে ফাইলগুলিকে জিপ করে না (কেবল ফাইলগুলিকে জিপ করে না অন্য কিছু), আমার প্রশ্ন এবং উত্তরটি এখানে দেখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.