Cách nén toàn bộ thư mục bằng PHP


131

Tôi đã tìm thấy ở đây tại stackoveflow một số mã về cách ZIP một tệp cụ thể, nhưng còn một thư mục cụ thể thì sao?

Folder/
  index.html
  picture.jpg
  important.txt

bên trong My Folder, có tập tin. Sau khi nén My Folder, tôi cũng muốn xóa toàn bộ nội dung của thư mục ngoại trừ important.txt.

Tìm thấy ở đây tại stack

Tôi cần bạn giúp. cảm ơn.


Theo như tôi có thể thấy, liên kết stackoverflow mà bạn đã cung cấp thực sự có nhiều tệp zip. Phần nào bạn gặp khó khăn với?
Lasse Espeholt

@lasseespeholt Liên kết tôi đã cung cấp cho bạn chỉ một tệp cụ thể, không phải thư mục và nội dung của thư mục ..
woninana

Anh ta lấy một mảng các tệp (về cơ bản là một thư mục) và thêm tất cả các tệp vào tệp zip (vòng lặp). Tôi có thể thấy một câu trả lời tốt đã được đăng ngay +1 :) đó là cùng một mã, mảng chỉ là một danh sách các tệp từ một thư mục bây giờ.
Lasse Espeholt


Điều này có thể giúp bạn mã hóabin.com/compressing
MKD

Câu trả lời:


320

Mã cập nhật 2015/04/22.

Zip toàn bộ thư mục:

// 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();

Zip toàn bộ thư mục + xóa tất cả các tệp ngoại trừ "Quan trọng":

// 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
Bạn phải đặt chmod (có thể ghi) trên dir (nơi đặt tập lệnh này) thành 777. Ví dụ: Nếu tập lệnh nằm trong /var/www/localhost/script.php, thì bạn cần đặt chmod 0777 trên dir / var / www / localhost /.
Dador

3
Xóa các tập tin trước khi gọi $zip->close()sẽ không hoạt động. Kiểm tra câu trả lời của tôi ở đây
hek2mgl

10
@alnassre đó là yêu cầu từ câu hỏi: "tôi cũng muốn xóa toàn bộ nội dung của thư mục ngoại trừ quan trọng". Ngoài ra tôi khuyên bạn luôn luôn đọc mã trước khi thực hiện nó.
Dador

1
@alnassre hahahaha ... xin lỗi :) ... hahaha
Ondrej Rafaj

1
@ nick-newman, yeah, để tính phần trăm, bạn có thể sử dụng php.net/manual/ru/feft.iterator-count.php + bộ đếm bên trong vòng lặp. Về mức độ nén - không thể thực hiện được với ZipArchive tại thời điểm này: stackoverflow.com/questions/1833168/
mẹo

54

Có một phương thức không có giấy tờ hữu ích trong lớp ZipArchive: addGlob ();

$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();

Bây giờ được ghi lại tại: www.php.net/manual/en/ziparchive.addglob.php


2
@netcoder - về lợi ích của việc viết phpt để kiểm tra nó ... về cơ bản, hãy đọc qua nguồn cho lớp ZipArchive và tìm thấy nó ở đó .... cũng có một phương thức addPotype () không có bản quyền, có kiểu mẫu regrec, nhưng tôi chưa bao giờ quản lý để làm việc đó (có thể là một lỗi trong lớp)
Mark Baker

1
@kread - bạn có thể sử dụng điều này với bất kỳ danh sách tệp nào có thể được trích xuất bằng global (), vì vậy tôi đã thấy nó cực kỳ hữu ích kể từ khi tôi phát hiện ra nó.
Mark Baker

@MarkBaker Tôi biết nhận xét này sẽ xuất hiện trong nhiều năm sau khi bạn đăng, tôi chỉ đang thử vận ​​may của mình ở đây. Tôi cũng đã đăng một câu hỏi ở đây về việc nén. Tôi sắp thử phương pháp toàn cầu mà bạn đã đăng ở đây, nhưng vấn đề chính của tôi là tôi không thể sử dụng addFromString và đã sử dụng addFile, điều này chỉ thất bại trong âm thầm. Bạn có thể có bất kỳ ý tưởng nào về những gì có thể sai, hoặc những gì tôi có thể làm sai?
Skytiger 18/03/2015

@ user1032531 - dòng cuối cùng của bài đăng của tôi (được chỉnh sửa ngày 13 tháng 12 năm 2013) chỉ ra điều đó, với một liên kết đến trang tài liệu
Mark Baker

6
addGlobđệ quy?
Vincent Poirier

20

Thử cái này:

$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();

Điều này sẽ không zip đệ quy mặc dù.


Nó chắc chắn sẽ xóa một số tệp trong My folder, nhưng tôi cũng có một thư mục trong một thư mục My foldergây ra lỗi cho tôi: Quyền bị từ chối bằng cách hủy liên kết thư mục với inMy folder
woninana

@Stupefy: Hãy thử if (!is_dir($file) && $file != 'target_folder...')thay thế. Hoặc kiểm tra câu trả lời @kread nếu bạn muốn nén đệ quy, đó là cách hiệu quả nhất.
netcoder

Thư mục trong My foldervẫn không bị xóa, nhưng dù sao cũng không có lỗi nữa.
woninana

Tôi cũng quên đề cập rằng tôi không có tệp .zip nào được tạo.
woninana

1
Xóa các tập tin trước khi gọi $zip->close()sẽ không hoạt động. Kiểm tra câu trả lời của tôi ở đây
hek2mgl

19

Tôi giả sử điều này đang chạy trên một máy chủ có ứng dụng zip nằm trong đường dẫn tìm kiếm. Nên đúng với tất cả các máy chủ dựa trên unix và tôi đoán hầu hết các máy chủ dựa trên windows.

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

Các kho lưu trữ sẽ nằm trong archive.zip sau đó. Hãy nhớ rằng khoảng trống trong tên tệp hoặc thư mục là nguyên nhân phổ biến gây ra lỗi và nên tránh nếu có thể.


15

Tôi đã thử với mã dưới đây và nó đang hoạt động. Mã này là tự giải thích, xin vui lòng cho tôi biết nếu bạn có bất kỳ câu hỏi.

<?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';
}
?>

Giải pháp tuyệt vời. Nó hoạt động trong laravel 5.5 quá. thực sự thích điều đó (y)
Nghệ nhân web

1
Mã tuyệt vời! Sạch sẽ, đơn giản và làm việc hoàn hảo! ;) Dường như đối với tôi câu trả lời tốt nhất. Nếu nó có thể giúp ai đó: Tôi chỉ cần thêm ini_set('memory_limit', '512M');trước khi thực thi tập lệnh và ini_restore('memory_limit');ở cuối. Cần tránh thiếu bộ nhớ trong trường hợp thư mục nặng (đó là thư mục lớn hơn 500MB).
Jacopo Pace

1
Trong môi trường của tôi (PHP 7.3, Debian) một tệp lưu trữ ZIP không có danh sách thư mục đã được tạo (tệp lớn, trống). Tôi đã phải thay đổi dòng sau: $ name. = '/'; vào $ name = ($ name == '.'? '': $ name. '/');
Gerfried

Đây là làm việc cho tôi. Cám ơn vì đã chia sẻ. Chúc mừng!
Sathiska

8

Đây là một chức năng nén toàn bộ thư mục và nội dung của nó vào một tệp zip và bạn có thể sử dụng nó đơn giản như thế này:

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

chức năng :

// 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";
}

Làm thế nào để bao gồm các thư mục con quá trong bản sao lưu tự động với tập lệnh này? @Alireza
floCoder

2

Tại sao không thử EFS PhP-ZiP MultiVolume Script ... Tôi đã nén và chuyển hàng trăm hợp đồng biểu diễn và hàng triệu tệp ... ssh là cần thiết để tạo lưu trữ hiệu quả.

Nhưng tôi tin rằng các tệp kết quả có thể được sử dụng với exec trực tiếp từ php:

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

Tôi không biết nếu nó hoạt động. Tôi đã không cố gắng ...

"Bí mật" là thời gian thực hiện để lưu trữ không được vượt quá thời gian cho phép thực thi mã PHP.


1

Đây là một ví dụ hoạt động của việc tạo ZIP trong PHP:

$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

Tôi tìm thấy bài đăng này trong google là kết quả hàng đầu thứ hai, đầu tiên là sử dụng exec :(

Dù sao, trong khi điều này không đáp ứng chính xác nhu cầu của tôi .. Tôi quyết định đăng câu trả lời cho người khác bằng phiên bản nhanh nhưng mở rộng này.

TÍNH NĂNG SCRIPT

  • Đặt tên tệp sao lưu theo ngày, PREFIX-YYYY-MM-DD-POSTFIX.EXTENSION
  • Báo cáo tập tin / mất tích
  • Danh sách sao lưu trước
  • Không nén / bao gồm các bản sao lưu trước đó;)
  • Hoạt động trên windows / linux

Dù sao, vào kịch bản .. Mặc dù nó có thể trông rất nhiều .. Hãy nhớ rằng có dư thừa ở đây .. Vì vậy, hãy thoải mái xóa các phần báo cáo khi cần ...

Ngoài ra, nó cũng có thể trông lộn xộn và một số thứ có thể được dọn sạch dễ dàng ... Vì vậy, đừng bình luận về nó, nó chỉ là một kịch bản nhanh với các bình luận cơ bản được gửi vào .. KHÔNG ĐƯỢC SỬ DỤNG TRỰC TIẾP .. Nhưng dễ dàng dọn dẹp để sử dụng trực tiếp !

Trong ví dụ này, nó được chạy từ một thư mục nằm trong thư mục gốc www / public_html .. Vì vậy, chỉ cần di chuyển lên một thư mục để đến thư mục gốc.

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

NÓ LÀM GÌ??

Nó chỉ đơn giản là nén nội dung đầy đủ của biến $ pathBase và lưu trữ zip trong cùng thư mục đó. Nó thực hiện một phát hiện đơn giản cho các bản sao lưu trước đó và bỏ qua chúng.

QUAY LẠI

Kịch bản này tôi vừa thử nghiệm trên linux và hoạt động tốt từ công việc định kỳ bằng cách sử dụng url tuyệt đối cho pathBase.


Tôi cũng đã loại trừ tập lệnh xóa, bạn có thể thấy câu trả lời được chấp nhận cho điều này
Angry 84

Phải yêu những phiếu giảm ngẫu nhiên mà không có một bình luận giải thích lý do tại sao.
Tức giận 84

1

Sử dụng chức năng này:

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();
}

Ví dụ sử dụng:

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

1

Sử dụng này là hoạt động tốt.

$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

Tạo một thư mục zip trong PHP.

Phương pháp tạo zip

   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;
    }


}

Gọi phương thức zip

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

0

Tôi đã làm một số cải tiến nhỏ trong kịch bản.

  <?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();
    ?>

Điều này làm zip các tập tin nhưng danh sách thư mục đã biến mất, nó không còn thư mục nữa
Sujay sreedhar

0

Điều này sẽ giải quyết vấn đề của bạn. Hãy thử nó.

$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

Đối với bất kỳ ai đọc bài đăng này và tìm kiếm lý do để nén các tệp bằng addFile thay vì addFromString, điều đó không nén các tệp bằng đường dẫn tuyệt đối của họ (chỉ nén các tệp và không có gì khác), hãy xem câu hỏi và câu trả lời của tôi ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.