Сжатие в zip-файл директории

Discussion in 'ПО для Web разработчика' started by AkyHa_MaTaTa, 19 Nov 2007.

  1. AkyHa_MaTaTa

    AkyHa_MaTaTa Elder - Старейшина

    Joined:
    19 Mar 2007
    Messages:
    557
    Likes Received:
    306
    Reputations:
    27
    Собственно, мне необходимо скриптик на php которому передаешь названия диры - а он ее сжимает в zip архив вместе совсеми каталогами и файлами.Где то я видел такой.
     
  2. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Адаптируй код отсюда http://devzone.zend.com/article/2105-Dynamically-Creating-Compressed-Zip-Archives-With-PHP
     
    _________________________
  3. AkyHa_MaTaTa

    AkyHa_MaTaTa Elder - Старейшина

    Joined:
    19 Mar 2007
    Messages:
    557
    Likes Received:
    306
    Reputations:
    27
    Не я хотел готовые, ну ладно буду сам кодлить. А на счет сылки, в мане по пхп таких примеров хватает, уж лучше я возьму готовый класс из phpMyAdmin zip.lib.php. Ну все равно спасибо.
     
  4. DIAgen

    DIAgen Banned Life!

    Joined:
    2 May 2006
    Messages:
    1,055
    Likes Received:
    376
    Reputations:
    460
    Вот держи... писал давно для себя и написан коряво на работает
    PHP:
    <?php
    @ini_set('set_time_limit',0);
    @
    set_time_limit(0);
    error_reporting(7);

    $zipfile = new zipfile();
     function 
    _readdir($d,&$files) {
    global 
    $opendir;
    $dir opendir ($d);
      while ( 
    $file readdir ($dir))
      {
         if (( 
    $file != ".") && ($file != ".."))
    {
       
    $opendir=$d.'/'.$file;
             if(
    filetype($opendir)=="dir")
            {
            
    _readdir($opendir,&$files);
            }
            else
            {
             
    $files[] = $opendir;

       }
       }
    }
       
    closedir ($dir);
     }
     
     
    _readdir('/home/',&$files); // ТУт указываем полный путь до папки которую нужно жать....
     
      
    foreach ($files as $index) {
     
    $zipfile -> addFile(file_get_contents($index), $index);
     }

    $dump_buffer $zipfile -> file(); // отправляем готовый архив в переменную для экспорта(вывода)

    header('Content-Type: application/x-zip');
    header("Content-Length: ".strlen($dump_buffer));
    header('Content-Disposition: attachment; filename="myarchive.zip"');
    echo 
    $dump_buffer

    class 
    zipfile
    {

        var 
    $datasec      = array();

        var 
    $ctrl_dir     = array();

        var 
    $eof_ctrl_dir "\x50\x4b\x05\x06\x00\x00\x00\x00";

        var 
    $old_offset   0;


        function 
    unix2DosTime($unixtime 0) {
            
    $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);

            if (
    $timearray['year'] < 1980) {
                    
    $timearray['year']    = 1980;
                    
    $timearray['mon']     = 1;
                    
    $timearray['mday']    = 1;
                    
    $timearray['hours']   = 0;
                    
    $timearray['minutes'] = 0;
                    
    $timearray['seconds'] = 0;
            } 
    // end if

            
    return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
                    (
    $timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
        } 
    // end of the 'unix2DosTime()' method
        
    function addFile($data$name$time 0)
        {
            
    $name     str_replace('\\''/'$name);

            
    $dtime    dechex($this->unix2DosTime($time));
            
    $hexdtime '\x' $dtime[6] . $dtime[7]
                      . 
    '\x' $dtime[4] . $dtime[5]
                      . 
    '\x' $dtime[2] . $dtime[3]
                      . 
    '\x' $dtime[0] . $dtime[1];
            eval(
    '$hexdtime = "' $hexdtime '";');

            
    $fr   "\x50\x4b\x03\x04";
            
    $fr   .= "\x14\x00";            // ver needed to extract
            
    $fr   .= "\x00\x00";            // gen purpose bit flag
            
    $fr   .= "\x08\x00";            // compression method
            
    $fr   .= $hexdtime;             // last mod time and date

            // "local file header" segment
            
    $unc_len strlen($data);
            
    $crc     crc32($data);
            
    $zdata   gzcompress($data);
            
    $zdata   substr(substr($zdata0strlen($zdata) - 4), 2); // fix crc bug
            
    $c_len   strlen($zdata);
            
    $fr      .= pack('V'$crc);             // crc32
            
    $fr      .= pack('V'$c_len);           // compressed filesize
            
    $fr      .= pack('V'$unc_len);         // uncompressed filesize
            
    $fr      .= pack('v'strlen($name));    // length of filename
            
    $fr      .= pack('v'0);                // extra field length
            
    $fr      .= $name;

            
    // "file data" segment
            
    $fr .= $zdata;

            
    // "data descriptor" segment (optional but necessary if archive is not
            // served as file)
            
    $fr .= pack('V'$crc);                 // crc32
            
    $fr .= pack('V'$c_len);               // compressed filesize
            
    $fr .= pack('V'$unc_len);             // uncompressed filesize

            // add this entry to array
            
    $this -> datasec[] = $fr;

            
    // now add to central directory record
            
    $cdrec "\x50\x4b\x01\x02";
            
    $cdrec .= "\x00\x00";                // version made by
            
    $cdrec .= "\x14\x00";                // version needed to extract
            
    $cdrec .= "\x00\x00";                // gen purpose bit flag
            
    $cdrec .= "\x08\x00";                // compression method
            
    $cdrec .= $hexdtime;                 // last mod time & date
            
    $cdrec .= pack('V'$crc);           // crc32
            
    $cdrec .= pack('V'$c_len);         // compressed filesize
            
    $cdrec .= pack('V'$unc_len);       // uncompressed filesize
            
    $cdrec .= pack('v'strlen($name) ); // length of filename
            
    $cdrec .= pack('v');             // extra field length
            
    $cdrec .= pack('v');             // file comment length
            
    $cdrec .= pack('v');             // disk number start
            
    $cdrec .= pack('v');             // internal file attributes
            
    $cdrec .= pack('V'32 );            // external file attributes - 'archive' bit set

            
    $cdrec .= pack('V'$this -> old_offset ); // relative offset of local header
            
    $this -> old_offset += strlen($fr);

            
    $cdrec .= $name;

            
    // optional extra field, file comment goes here
            // save to central directory
            
    $this -> ctrl_dir[] = $cdrec;
        } 
    // end of the 'addFile()' method
        
    function file()
        {
            
    $data    implode(''$this -> datasec);
            
    $ctrldir implode(''$this -> ctrl_dir);

            return
                
    $data .
                
    $ctrldir .
                
    $this -> eof_ctrl_dir .
                
    pack('v'sizeof($this -> ctrl_dir)) .  // total # of entries "on this disk"
                
    pack('v'sizeof($this -> ctrl_dir)) .  // total # of entries overall
                
    pack('V'strlen($ctrldir)) .           // size of central dir
                
    pack('V'strlen($data)) .              // offset to start of central dir
                
    "\x00\x00";                             // .zip file comment length
        
    // end of the 'file()' method

    // end of the 'zipfile' class
    Думаю не надо объяснять как и что делать... сам разберешься...)
     
    8 people like this.
  5. AkyHa_MaTaTa

    AkyHa_MaTaTa Elder - Старейшина

    Joined:
    19 Mar 2007
    Messages:
    557
    Likes Received:
    306
    Reputations:
    27
    Главное что работает...,
    _readdir('/home/',&$files); // ТУт указываем полный путь до папки которую нужно жать....

    спс.+
     
    #5 AkyHa_MaTaTa, 19 Nov 2007
    Last edited: 19 Nov 2007
  6. RaiDeRz

    RaiDeRz Elder - Старейшина

    Joined:
    5 Apr 2007
    Messages:
    121
    Likes Received:
    5
    Reputations:
    0
    PCLZip вроде так называеться, мощная библиотека для создания ZIP-архивов, а не то что в phpMyAdmin псевдо zip-архивы.
    Она как раз может сразу папку запаковывать и т.п.
     
  7. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    system("zip '$file' . '$dir'");
     
  8. GrAmOzEkA

    GrAmOzEkA Elder - Старейшина

    Joined:
    25 Jun 2006
    Messages:
    234
    Likes Received:
    76
    Reputations:
    29
    PHP zip 1.8 RC1
    Скрипт для работы с zip/rar архивами прямо на сервере через удобную оболочку. Просмотр содержимого архивов, распаковка всего целиком или отдельных файлов в выбранную папку и т.д.
    ХоумПага: http://www.phpconcept.net/phpzip/
     
  9. Sn@k3

    Sn@k3 Elder - Старейшина

    Joined:
    13 Apr 2006
    Messages:
    1,000
    Likes Received:
    438
    Reputations:
    90

    п.с.
    Code:
    http://www.phpconcept.net/download.php?file='%22%3E'%3E%3Cscript%3Ealert();%3C/script%3Epclzip-2-6.zip
     
    2 people like this.
  10. Ali_MiX

    Ali_MiX Elder - Старейшина

    Joined:
    8 Oct 2006
    Messages:
    377
    Likes Received:
    67
    Reputations:
    -2
    загружаем shell или како нить с(); и вот
    tar -cvf file.tar /full/path - создать .tar
    tar -czvf file.tar.gz /full/path - создать .tar.gz (архив)
    tar -cjvf file.tar.bz2 /full/path - создать .tar.bz2 (архив)