Cara zip seluruh folder menggunakan PHP


132

Saya telah menemukan di sini di stackoveflow beberapa kode tentang cara ZIP file tertentu, tetapi bagaimana dengan folder tertentu?

Folder/
  index.html
  picture.jpg
  important.txt

di dalam My Folder, ada file. setelah zip My Folder, saya juga ingin menghapus seluruh isi folder kecuali important.txt.

Menemukan ini di sini di tumpukan

Saya membutuhkan bantuan Anda. Terima kasih.


Sejauh yang saya bisa lihat, tautan stackoverflow yang Anda berikan sebenarnya mem-zip beberapa file. Bagian mana yang bermasalah dengan Anda?
Lasse Espeholt

@ classeespeholt Tautan yang saya berikan hanya zip file tertentu, bukan folder dan isi folder ..
woninana

Dia mengambil array file (pada dasarnya folder) dan menambahkan semua file ke file zip (loop). Saya dapat melihat jawaban yang baik telah diposting sekarang +1 :) yang merupakan kode yang sama, array hanyalah daftar file dari direktori sekarang.
Lasse Espeholt


Jawaban:


321

Kode diperbarui 2015/04/22.

Zip seluruh folder:

// 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 seluruh folder + hapus semua file kecuali "important.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
Anda harus mengatur chmod (dapat ditulis) pada dir (di mana letak skrip ini) menjadi 777. Misalnya: Jika skrip terletak di /var/www/localhost/script.php, maka Anda perlu menetapkan chmod 0777 pada dir / var / www / localhost /.
Dador

3
Menghapus file sebelum memanggil $zip->close()tidak akan berhasil. Periksa jawaban saya di sini
hek2mgl

10
@alnassre yang merupakan persyaratan dari pertanyaan: "Saya juga ingin menghapus seluruh isi folder kecuali important.txt". Saya juga menyarankan Anda untuk selalu membaca kode sebelum menjalankannya.
Dador

1
@alnassre hahahaha ... sorry :) ... hahaha
Ondrej Rafaj

1
@ nick-newman, yeah, untuk menghitung persen Anda dapat menggunakan php.net/manual/ru/function.iterator-count.php + counter di dalam loop. Mengenai tingkat kompresi - tidak mungkin dengan ZipArchive saat ini: stackoverflow.com/questions/1833168/…
Dador

54

Ada metode tak berdokumen yang berguna di kelas 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();

Sekarang didokumentasikan di: www.php.net/manual/en/ziparchive.addglob.php


2
@netcoder - manfaat menulis phpt untuk mengujinya ... pada dasarnya, baca sumber untuk kelas ZipArchive, dan temukan di sana .... ada juga metode addPattern () yang tidak didokumentasikan yang menggunakan pola gaya regexp, tapi saya tidak pernah berhasil membuatnya bekerja (mungkin ada bug di kelas)
Mark Baker

1
@kread - Anda dapat menggunakan ini dengan daftar file apa saja yang dapat diekstraksi menggunakan glob (), jadi saya merasa ini sangat berguna sejak saya menemukannya.
Mark Baker

@ MarkBaker Saya tahu komentar ini akan muncul bertahun-tahun setelah Anda memposting, saya hanya mencoba keberuntungan saya di sini. Saya telah mengirim pertanyaan di sini tentang zip juga. Saya akan mencoba metode glob yang Anda posting di sini, tetapi masalah utama saya adalah saya tidak dapat menggunakan addFromString, dan telah menggunakan addFile, yang gagal secara diam-diam. Apakah Anda mungkin tahu apa yang salah, atau apa yang salah?
Skytiger

@ user1032531 - baris terakhir dari posting saya (diedit 13 Desember 2013) menunjukkan hal itu, dengan tautan ke halaman dokumen
Mark Baker

6
Apakah addGlobrekursif?
Vincent Poirier

20

Coba ini:

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

Ini tidak akan zip secara rekursif.


Ini memang menghapus beberapa file My folder, tetapi saya juga memiliki folder di dalam folder My folderyang memberi saya kesalahan: Izin ditolak dengan membatalkan tautan folder dengan diMy folder
woninana

@Stupefy: Coba if (!is_dir($file) && $file != 'target_folder...')sebagai gantinya. Atau periksa jawaban @kread jika Anda ingin melakukan zip secara rekursif, ini adalah cara yang paling efisien.
netcoder

Folder di dalam My foldermasih belum dihapus, tetapi tidak ada lagi kesalahan.
woninana

Saya juga lupa menyebutkan bahwa saya tidak ada file zip.
woninana

1
Menghapus file sebelum memanggil $zip->close()tidak akan berhasil. Periksa jawaban saya di sini
hek2mgl

19

Saya menganggap ini berjalan di server di mana aplikasi zip berada di jalur pencarian. Seharusnya berlaku untuk semua berbasis unix dan saya kira sebagian besar server berbasis windows.

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

Arsip akan berada di archive.zip sesudahnya. Ingatlah bahwa kekosongan dalam nama file atau folder adalah penyebab umum kesalahan dan harus dihindari jika memungkinkan.


15

Saya mencoba dengan kode di bawah ini dan berfungsi. Kode ini cukup jelas, beri tahu saya jika Anda memiliki pertanyaan.

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

Solusi yang sangat baik. Ini bekerja di laravel 5.5 juga. sangat suka itu. (y)
Web Artisan

1
Kode hebat! Bersih, sederhana dan berfungsi dengan baik! ;) Tampaknya bagi saya jawaban terbaik. Jika itu dapat membantu seseorang: Saya baru saja menambahkan ini_set('memory_limit', '512M');sebelum pelaksanaan skrip dan ini_restore('memory_limit');di akhir. Itu perlu untuk menghindari kekurangan memori dalam kasus folder berat (itu folder lebih besar dari 500MB).
Jacopo Pace

1
Di lingkungan saya (PHP 7.3, Debian) arsip ZIP tanpa daftar direktori dibuat (file besar, kosong). Saya harus mengubah baris berikut: $ name. = '/'; ke dalam $ name = ($ name == '.'? '': $ name. '/');
Gerfried

Ini bekerja untuk saya. Terima kasih telah berbagi. Bersulang!
Sathiska

8

Ini adalah fungsi yang zip seluruh folder dan isinya ke file zip dan Anda dapat menggunakannya sederhana seperti ini:

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

fungsi:

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

Bagaimana cara memasukkan sub-folder juga dalam cadangan secara otomatis dengan skrip ini? @Alireza
floCoder

2

Mengapa tidak Coba EFS PhP-ZiP MultiVolume Script ... Saya zip dan mentransfer ratusan pertunjukan dan jutaan file ... ssh diperlukan untuk membuat arsip secara efektif.

Tetapi saya yakin bahwa file yang dihasilkan dapat digunakan dengan exec langsung dari php:

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

Saya tidak tahu apakah itu berhasil. Saya belum mencoba ...

"Rahasianya" adalah bahwa waktu eksekusi untuk pengarsipan tidak boleh melebihi waktu yang diizinkan untuk eksekusi kode PHP.


1

Ini adalah contoh kerja pembuatan ZIP di 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

Saya menemukan posting ini di google sebagai hasil teratas kedua, pertama menggunakan exec :(

Ngomong-ngomong, sementara ini tidak sesuai dengan kebutuhan saya .. Saya memutuskan untuk mengirim jawaban untuk orang lain dengan versi saya yang cepat namun diperluas.

FITUR SCRIPT

  • Nama file cadangan hari demi hari, PREFIX-YYYY-MM-DD-POSTFIX.EXTENSION
  • Pelaporan File / Tidak Ada
  • Daftar Backup Sebelumnya
  • Tidak zip / sertakan cadangan sebelumnya;)
  • Bekerja di windows / linux

Ngomong-ngomong, ke skrip .. Meskipun mungkin terlihat seperti banyak .. Ingat ada kelebihan di sini .. Jadi jangan ragu untuk menghapus bagian pelaporan sesuai kebutuhan ...

Juga mungkin terlihat berantakan juga dan hal-hal tertentu dapat dibersihkan dengan mudah ... Jadi jangan berkomentar tentang itu, itu hanya skrip cepat dengan komentar dasar yang dilemparkan .. BUKAN UNTUK PENGGUNAAN LANGSUNG .. Tapi mudah dibersihkan untuk penggunaan langsung !

Dalam contoh ini, dijalankan dari direktori yang ada di dalam folder root www / public_html .. Jadi hanya perlu melakukan perjalanan satu folder untuk sampai ke root.

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

APA YANG DILAKUKANNYA ??

Ini hanya akan zip isi lengkap variabel $ pathBase dan menyimpan zip di folder yang sama. Ini melakukan deteksi sederhana untuk backup sebelumnya dan melompati mereka.

CADANGAN CRON

Script ini saya baru saja diuji di linux dan bekerja dengan baik dari cron job dengan menggunakan url absolut untuk pathBase.


Saya juga sudah mengecualikan skrip hapus, Anda dapat melihat jawaban yang diterima untuk ini
Marah 84

Harus menyukai suara acak tanpa komentar yang menjelaskan alasannya.
Marah 84

1

Gunakan fungsi ini:

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

Contoh penggunaan:

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

1

Gunakan ini berfungsi dengan baik.

$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

Buat folder zip di PHP.

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


}

Panggil metode zip

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

0

Saya melakukan sedikit perbaikan dalam naskah.

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

Ini melakukan zip file tetapi daftar direktori hilang itu dosis tidak memiliki direktori lagi
Sujay sreedhar

0

Ini akan menyelesaikan masalah Anda. Silakan dicoba.

$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

Bagi siapa pun yang membaca posting ini dan mencari alasan untuk melakukan zip file menggunakan addFile alih-alih addFromString, yang tidak zip file dengan path absolut mereka (hanya zip file dan tidak ada yang lain), lihat pertanyaan saya dan jawab di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.