Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Класс для работы с zip-архивами

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: PHP, ZIP
evgenijj
Отправлено: 05 Июля, 2007 - 20:35:10
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




http://www.phpclasses[dot]org/browse[dot][dot][dot]ackage/2322[dot]html
Класс позволяет создавать zip-файлы с иерархией папок
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. /**
  5.  * Class to dynamically create a zip file (archive)
  6.  *
  7.  * @author Rochak Chauhan
  8.  */
  9.  
  10. class createZip  {  
  11.  
  12.         public $compressedData = array();
  13.         public $centralDirectory = array(); // central directory  
  14.         public $endOfCentralDirectory = "\\x50\\x4b\\x05\\x06\\x00\\x00\\x00\\x00"; //end of Central directory record
  15.         public $oldOffset = 0;
  16.  
  17.         /**
  18.          * Function to create the directory where the file(s) will be unzipped
  19.          *
  20.          * @param $directoryName string
  21.          *
  22.          */
  23.        
  24.         public function addDirectory($directoryName) {
  25.                 $directoryName = str_replace("\\\\", "/", $directoryName);  
  26.  
  27.                 $feedArrayRow = "\\x50\\x4b\\x03\\x04";
  28.                 $feedArrayRow .= "\\x0a\\x00";    
  29.                 $feedArrayRow .= "\\x00\\x00";    
  30.                 $feedArrayRow .= "\\x00\\x00";    
  31.                 $feedArrayRow .= "\\x00\\x00\\x00\\x00";
  32.  
  33.                 $feedArrayRow .= pack("V",0);
  34.                 $feedArrayRow .= pack("V",0);
  35.                 $feedArrayRow .= pack("V",0);
  36.                 $feedArrayRow .= pack("v", strlen($directoryName) );
  37.                 $feedArrayRow .= pack("v", 0 );
  38.                 $feedArrayRow .= $directoryName;  
  39.  
  40.                 $feedArrayRow .= pack("V",0);
  41.                 $feedArrayRow .= pack("V",0);
  42.                 $feedArrayRow .= pack("V",0);
  43.  
  44.                 $this -> compressedData[] = $feedArrayRow;
  45.                
  46.                 $newOffset = strlen(implode("", $this->compressedData));
  47.  
  48.                 $addCentralRecord = "\\x50\\x4b\\x01\\x02";
  49.                 $addCentralRecord .="\\x00\\x00";    
  50.                 $addCentralRecord .="\\x0a\\x00";    
  51.                 $addCentralRecord .="\\x00\\x00";    
  52.                 $addCentralRecord .="\\x00\\x00";    
  53.                 $addCentralRecord .="\\x00\\x00\\x00\\x00";
  54.                 $addCentralRecord .= pack("V",0);
  55.                 $addCentralRecord .= pack("V",0);
  56.                 $addCentralRecord .= pack("V",0);
  57.                 $addCentralRecord .= pack("v", strlen($directoryName) );
  58.                 $addCentralRecord .= pack("v", 0 );
  59.                 $addCentralRecord .= pack("v", 0 );
  60.                 $addCentralRecord .= pack("v", 0 );
  61.                 $addCentralRecord .= pack("v", 0 );
  62.                 $ext = "\\x00\\x00\\x10\\x00";
  63.                 $ext = "\\xff\\xff\\xff\\xff";  
  64.                 $addCentralRecord .= pack("V", 16 );
  65.  
  66.                 $addCentralRecord .= pack("V", $this -> oldOffset );
  67.                 $this -> oldOffset = $newOffset;
  68.  
  69.                 $addCentralRecord .= $directoryName;  
  70.  
  71.                 $this -> centralDirectory[] = $addCentralRecord;  
  72.         }        
  73.        
  74.         /**
  75.          * Function to add file(s) to the specified directory in the archive
  76.          *
  77.          * @param $directoryName string
  78.          *
  79.          */
  80.        
  81.         public function addFile($data, $directoryName)   {
  82.  
  83.                 $directoryName = str_replace("\\\\", "/", $directoryName);  
  84.        
  85.                 $feedArrayRow = "\\x50\\x4b\\x03\\x04";
  86.                 $feedArrayRow .= "\\x14\\x00";    
  87.                 $feedArrayRow .= "\\x00\\x00";    
  88.                 $feedArrayRow .= "\\x08\\x00";    
  89.                 $feedArrayRow .= "\\x00\\x00\\x00\\x00";
  90.  
  91.                 $uncompressedLength = strlen($data);  
  92.                 $compression = crc32($data);  
  93.                 $gzCompressedData = gzcompress($data);  
  94.                 $gzCompressedData = substr( substr($gzCompressedData, 0, strlen($gzCompressedData) - 4), 2);
  95.                 $compressedLength = strlen($gzCompressedData);  
  96.                 $feedArrayRow .= pack("V",$compression);
  97.                 $feedArrayRow .= pack("V",$compressedLength);
  98.                 $feedArrayRow .= pack("V",$uncompressedLength);
  99.                 $feedArrayRow .= pack("v", strlen($directoryName) );
  100.                 $feedArrayRow .= pack("v", 0 );
  101.                 $feedArrayRow .= $directoryName;  
  102.  
  103.                 $feedArrayRow .= $gzCompressedData;  
  104.  
  105.                 $feedArrayRow .= pack("V",$compression);
  106.                 $feedArrayRow .= pack("V",$compressedLength);
  107.                 $feedArrayRow .= pack("V",$uncompressedLength);
  108.  
  109.                 $this -> compressedData[] = $feedArrayRow;
  110.  
  111.                 $newOffset = strlen(implode("", $this->compressedData));
  112.  
  113.                 $addCentralRecord = "\\x50\\x4b\\x01\\x02";
  114.                 $addCentralRecord .="\\x00\\x00";    
  115.                 $addCentralRecord .="\\x14\\x00";    
  116.                 $addCentralRecord .="\\x00\\x00";    
  117.                 $addCentralRecord .="\\x08\\x00";    
  118.                 $addCentralRecord .="\\x00\\x00\\x00\\x00";
  119.                 $addCentralRecord .= pack("V",$compression);
  120.                 $addCentralRecord .= pack("V",$compressedLength);
  121.                 $addCentralRecord .= pack("V",$uncompressedLength);
  122.                 $addCentralRecord .= pack("v", strlen($directoryName) );
  123.                 $addCentralRecord .= pack("v", 0 );
  124.                 $addCentralRecord .= pack("v", 0 );
  125.                 $addCentralRecord .= pack("v", 0 );
  126.                 $addCentralRecord .= pack("v", 0 );
  127.                 $addCentralRecord .= pack("V", 32 );
  128.  
  129.                 $addCentralRecord .= pack("V", $this -> oldOffset );
  130.                 $this -> oldOffset = $newOffset;
  131.  
  132.                 $addCentralRecord .= $directoryName;  
  133.  
  134.                 $this -> centralDirectory[] = $addCentralRecord;  
  135.         }
  136.  
  137.         /**
  138.          * Fucntion to return the zip file
  139.          *
  140.          * @return zipfile (archive)
  141.          */
  142.  
  143.         public function getZippedfile() {
  144.  
  145.                 $data = implode("", $this -> compressedData);  
  146.                 $controlDirectory = implode("", $this -> centralDirectory);  
  147.  
  148.                 return  
  149.                         $data.  
  150.                         $controlDirectory.  
  151.                         $this -> endOfCentralDirectory.  
  152.                         pack("v", sizeof($this -> centralDirectory)).    
  153.                         pack("v", sizeof($this -> centralDirectory)).    
  154.                         pack("V", strlen($controlDirectory)).            
  155.                         pack("V", strlen($data)).                
  156.                         "\\x00\\x00";                            
  157.         }
  158.  
  159.         /**
  160.          *
  161.          * Function to force the download of the archive as soon as it is created
  162.          *
  163.          * @param archiveName string - name of the created archive file
  164.          */
  165.  
  166.         public function forceDownload($archiveName) {
  167.                 $headerInfo = '';
  168.                  
  169.                 if(ini_get('zlib.output_compression')) {
  170.                         ini_set('zlib.output_compression', 'Off');
  171.                 }
  172.  
  173.                 // Security checks
  174.                 if( $archiveName == "" ) {
  175.                         echo "<html><title>Public Photo Directory - Download </title><body><BR><B>ERROR:</B> The download file was NOT SPECIFIED.</body></html>";
  176.                         exit;
  177.                 }
  178.                 elseif ( ! file_exists( $archiveName ) ) {
  179.                         echo "<html><title>Public Photo Directory - Download </title><body><BR><B>ERROR:</B> File not found.</body></html>";
  180.                         exit;
  181.                 }
  182.  
  183.                 header("Pragma: public");
  184.                 header("Expires: 0");
  185.                 header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  186.                 header("Cache-Control: private",false);
  187.                 header("Content-Type: application/zip");
  188.                 header("Content-Disposition: attachment; filename=".basename($archiveName).";" );
  189.                 header("Content-Transfer-Encoding: binary");
  190.                 header("Content-Length: ".filesize($archiveName));
  191.                 readfile("$archiveName");
  192.                
  193.          }
  194. }
  195. ?>
  196.  

Пример использования
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. include_once("createZip.inc.php");
  4. $createZip = new createZip;  
  5.  
  6. $createZip -> addDirectory("dir/");
  7.  
  8. $fileContents = file_get_contents("img.jpg");  
  9. $createZip -> addFile($fileContents, "dir/img.jpg");  
  10.  
  11. $fileName = "archive.zip";
  12. $fd = fopen ($fileName, "wb");
  13. $out = fwrite ($fd, $createZip -> getZippedfile());
  14. fclose ($fd);
  15.  
  16. $createZip -> forceDownload($fileName);
  17. @unlink($fileName);
  18. ?>
  19.  

И функция для извлечения файлов из архива
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $dir = realpath("./unzip");
  4. $file = realpath("./images.zip");
  5. $log = 1;
  6. unpackZip($dir, $file, $log);
  7.  
  8. /**
  9.  * Распаковывает zip-архив в указанный каталог.
  10.  * $dir  - полный путь к каталогу.
  11.  * $file - полный путь к zip-архиву.
  12.  * $log  - флаг вывода диагностики.
  13.  */
  14. function unpackZip($dir, $file, $log=0) {
  15.     if ($log) echo "Start unpack [$file] into [$dir] directory... <br/>";
  16.  
  17.     if ($zip = zip_open($file)) {
  18.         if ($zip) {
  19.             // создать каталог, если он не существует
  20.             if (! file_exists($dir)) mkdir($dir);
  21.  
  22.             while ($zip_entry = zip_read($zip)) {
  23.                 $name = zip_entry_name($zip_entry);
  24.                 if ($log) echo "   <b>unpack </b>: $name <br/>";
  25.  
  26.                 // последний символ имени
  27.                 $last = substr($name, strlen($name)-1);
  28.  
  29.                 // если это каталог
  30.                 if ($last == "/" || $last == "\\\\") {
  31.                     $subdir = $dir."/".$name;
  32.                     // создать каталог, если он не существует
  33.                     if (! file_exists($subdir)) mkdir ($subdir);
  34.                 } else {
  35.                     // распаковать файл
  36.                     if (zip_entry_open($zip,$zip_entry,"r")) {
  37.                         $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
  38.                         $fp = fopen($dir."/".zip_entry_name($zip_entry),"w");
  39.                         fwrite($fp,$buf);
  40.                         zip_entry_close($zip_entry);
  41.                     } else {
  42.                         return false;
  43.                     }
  44.                 }
  45.             }
  46.             zip_close($zip);
  47.         }
  48.     } else {
  49.         return false;
  50.     }
  51.  
  52.     return true;
  53. }
  54. ?>
  55.  
 
 Top
AcidSlayer
Отправлено: 09 Марта, 2011 - 14:36:56
Post Id



Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Март 2011  


Помог: 1 раз(а)




А разбивать файлы на части можно?
 
 Top
ALEN Модератор
Отправлено: 09 Марта, 2011 - 14:48:05
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




AcidSlayer
Что имеется в виду?
 
 Top
Viper
Отправлено: 09 Марта, 2011 - 15:06:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




ALEN многотомные архивы


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
AcidSlayer
Отправлено: 09 Марта, 2011 - 16:10:39
Post Id



Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Март 2011  


Помог: 1 раз(а)




Да, что бы их потом можно было обычным WinRAR собрать.
 
 Top
ALEN Модератор
Отправлено: 09 Марта, 2011 - 20:37:34
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




Viper AcidSlayer
На сервере нет тяжелых целостных данных, остальное можно просто запихнуть в разные архивы.
 
 Top
AcidSlayer
Отправлено: 09 Марта, 2011 - 22:15:13
Post Id



Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Март 2011  


Помог: 1 раз(а)




Смотри есть к примеру вдидео. Мне нужно его разбить по архивам что бы пользователь мог скачать его и распаковать комфортно.
Файл один, как его разбить?
(Добавление)
Может можно как-то используя командую строку в пхп разбить
В общем интересуют даже не чисто пхп решения...
(Добавление)
задачу решил
 
 Top
Viper
Отправлено: 10 Марта, 2011 - 08:19:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




ALEN дя а ж ничего против не имею Улыбка


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Okula
Отправлено: 11 Марта, 2011 - 11:45:42
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




Так есть же стандартная библиотека для работы с zip архивами, зачем свой велосипед делать?
 
 Top
ALEN Модератор
Отправлено: 11 Марта, 2011 - 12:20:16
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




Okula
Дату создания топика посмотри.
 
 Top
123456879
Отправлено: 14 Мая, 2011 - 03:01:09
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Май 2011  


Помог: 0 раз(а)




Доброго времени суток.

Подскажите пожалуйста, возможно ли собирать многотомные zip архивы.

php-unzipper.zip - в оригинале имеет pclzip.lib.php версии 1,3.
подсовываю ему разбитый архив zip - он видит (через view) что в нутри.
при нажатии unzip говорит что всё сделано и пишет извлечённый об`ём.
с сайта производителя скачал pclzip.lib.php версии "PhpConcept Library - Zip Module 2.8.2"
подсунул вместо старой. говорит и показывает всё тоже самое И так же не работает.
Можно ли решить как-нибудь эту задачу? если можно - прошу подсказать как.
спасибо
 
 Top
ALEN Модератор
Отправлено: 14 Мая, 2011 - 10:27:35
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




123456879
Чем не подходит отдельно файлы запихивать в разные архивы?
 
 Top
Мелкий Супермодератор
Отправлено: 14 Мая, 2011 - 10:43:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




ALEN, многотомники удобнее, можно не париться по поводу того, как файлы раскидать по архивам, чтобы они не превысили заданного объёма.

Только разве zip'ы вообще умеют быть многотомниками? Их и тот же самый вышеназванный winrar не умеет делать.

(Отредактировано автором: 14 Мая, 2011 - 10:45:30)



-----
PostgreSQL DBA
 
 Top
123456879
Отправлено: 14 Мая, 2011 - 19:03:09
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Май 2011  


Помог: 0 раз(а)




Умеют сейчас многие (winzip, winrar, Total Commander).
Получаются файлы : первый.zip второй.z01 третий.z02 четвёртый.z03

Очень жду ответа.
 
 Top
ALEN Модератор
Отправлено: 14 Мая, 2011 - 20:24:02
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




Как вариант консольные команды.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Пользовательские функции »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB