сжать / заархивировать папку используя скрипт php - PullRequest
9 голосов
/ 30 сентября 2010

Есть ли способ сжать / заархивировать папку на сервере с помощью php-скрипта в .zip или .rar или в любой другой сжатый формат, чтобы по запросу мы могли заархивировать папку и затем дать ссылку для скачивания

Заранее спасибо

Ответы [ 3 ]

14 голосов
/ 30 сентября 2010

Вот пример:

<?php

// Adding files to a .zip file, no zip file exists it creates a new ZIP file

// increase script timeout value
ini_set('max_execution_time', 5000);

// create object
$zip = new ZipArchive();

// open archive 
if ($zip->open('my-archive.zip', ZIPARCHIVE::CREATE) !== TRUE) {
    die ("Could not open archive");
}

// initialize an iterator
// pass it the directory to be processed
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("themes/"));

// iterate over the directory
// add each file found to the archive
foreach ($iterator as $key=>$value) {
    $zip->addFile(realpath($key), $key) or die ("ERROR: Could not add file: $key");
}

// close and save archive
$zip->close();
echo "Archive created successfully.";
?>
3 голосов
/ 06 сентября 2011

Остерегайтесь возможной проблемы в примере Adnan: если целевой файл myarchive.zip находится внутри исходной папки, то вам нужно исключить его из цикла или запустить итератор перед созданием файла архива (если он уже существует). Вот пересмотренный скрипт, который использует последнюю опцию и добавляет несколько конфигурационных переменных вверху. Этот не следует использовать для добавления в существующий архив.

<?php
// Config Vars 

$sourcefolder = "./"           ; // Default: "./" 
$zipfilename  = "myarchive.zip"; // Default: "myarchive.zip"
$timeout      = 5000           ; // Default: 5000

// instantate an iterator (before creating the zip archive, just
// in case the zip file is created inside the source folder)
// and traverse the directory to get the file list.
$dirlist = new RecursiveDirectoryIterator($sourcefolder);
$filelist = new RecursiveIteratorIterator($dirlist);

// set script timeout value 
ini_set('max_execution_time', $timeout);

// instantate object
$zip = new ZipArchive();

// create and open the archive 
if ($zip->open("$zipfilename", ZipArchive::CREATE) !== TRUE) {
    die ("Could not open archive");
}

// add each file in the file list to the archive
foreach ($filelist as $key=>$value) {
    $zip->addFile(realpath($key), $key) or die ("ERROR: Could not add file: $key");
}

// close the archive
$zip->close();
echo "Archive ". $zipfilename . " created successfully.";

// And provide download link ?>
<a href="http:<?php echo $zipfilename;?>" target="_blank">
Download <?php echo $zipfilename?></a> 
2 голосов
/ 30 сентября 2010

PHP поставляется с расширением ZipArchive , которое как раз для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...