Есть ли такой скрипт

Discussion in 'PHP' started by Vallez, 8 Mar 2007.

  1. Vallez

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

    Joined:
    25 Dec 2005
    Messages:
    89
    Likes Received:
    19
    Reputations:
    -8
    Мне нужен скрипт для архивирования файла на сервере и передачи его через http.
     
  2. zl0ba

    zl0ba ПсихолоГ

    Joined:
    10 Oct 2006
    Messages:
    393
    Likes Received:
    301
    Reputations:
    52
    PHP:
    <?php   

    /*  

    Zip file creation class  
    makes zip files on the fly...  

    use the functions add_dir() and add_file() to build the zip file;  
    see example code below  

    by Eric Mueller  
    http://www.themepark.com  

    v1.1 9-20-01  
      - added comments to example  

    v1.0 2-5-01  

    initial version with:  
      - class appearance  
      - add_file() and file() methods  
      - gzcompress() output hacking  
    by Denis O.Philippov, webmaster@atlant.ru, http://www.atlant.ru  

    */   

    // official ZIP file format: http://www.pkware.com/appnote.txt  

    class zipfile    
    {    

        var 
    $datasec = array(); // array to store compressed data  
        
    var $ctrl_dir = array(); // central directory     
        
    var $eof_ctrl_dir "\x50\x4b\x05\x06\x00\x00\x00\x00"//end of Central directory record  
        
    var $old_offset 0;   

        function 
    add_dir($name)     

        
    // adds "directory" to archive - do this before putting any files in directory!  
        // $name - name of directory... like this: "path/"  
        // ...then you can add files using add_file with names like "path/file.txt"  
        
    {    
            
    $name str_replace("\\""/"$name);    

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

            
    $fr .= pack("V",0); // crc32  
            
    $fr .= pack("V",0); //compressed filesize  
            
    $fr .= pack("V",0); //uncompressed filesize  
            
    $fr .= pack("v"strlen($name) ); //length of pathname  
            
    $fr .= pack("v"); //extra field length  
            
    $fr .= $name;    
            
    // end of "local file header" segment  

            // no "file data" segment for path  

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

            
    $new_offset strlen(implode(""$this->datasec));   

            
    // ext. file attributes mirrors MS-DOS directory attr byte, detailed  
            // at http://support.microsoft.com/support/kb/articles/Q125/0/19.asp  

            // now add to central record  
            
    $cdrec "\x50\x4b\x01\x02";   
            
    $cdrec .="\x00\x00";    // version made by  
            
    $cdrec .="\x0a\x00";    // version needed to extract  
            
    $cdrec .="\x00\x00";    // gen purpose bit flag  
            
    $cdrec .="\x00\x00";    // compression method  
            
    $cdrec .="\x00\x00\x00\x00"// last mod time & date  
            
    $cdrec .= pack("V",0); // crc32  
            
    $cdrec .= pack("V",0); //compressed filesize  
            
    $cdrec .= pack("V",0); //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  
            
    $ext "\x00\x00\x10\x00";   
            
    $ext "\xff\xff\xff\xff";    
            
    $cdrec .= pack("V"16 ); //external file attributes  - 'directory' bit set  

            
    $cdrec .= pack("V"$this -> old_offset ); //relative offset of local header  
            
    $this -> old_offset $new_offset;   

            
    $cdrec .= $name;    
            
    // optional extra field, file comment goes here  
            // save to array  
            
    $this -> ctrl_dir[] = $cdrec;    

               
        }   


        function 
    add_file($data$name)     

        
    // adds "file" to archive     
        // $data - file contents  
        // $name - name of file in archive. Add path if your want  

        
    {    
            
    $name str_replace("\\""/"$name);    
            
    //$name = str_replace("\\", "\\\\", $name);  

            
    $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 .= "\x00\x00\x00\x00"// last mod time and date  

            
    $unc_len strlen($data);    
            
    $crc crc32($data);    
            
    $zdata gzcompress($data);    
            
    $zdata substrsubstr($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"); //extra field length  
            
    $fr .= $name;    
            
    // end of "local file header" segment  
               
            // "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;   

            
    $new_offset strlen(implode(""$this->datasec));   

            
    // 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 .="\x00\x00\x00\x00"// 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  
    //        echo "old offset is ".$this->old_offset.", new offset is $new_offset<br>";  
            
    $this -> old_offset $new_offset;   

            
    $cdrec .= $name;    
            
    // optional extra field, file comment goes here  
            // save to central directory  
            
    $this -> ctrl_dir[] = $cdrec;    
        }   

        function 
    file() { // dump out 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  
        
    }   
    }    

    ?> 

    /* example */ 

    <?php    

    $zipfile 
    = new zipfile();    

    // add the subdirectory ... important!  
    $zipfile -> add_dir("dir/");   

    // add the binary data stored in the string 'filedata'  
    $filedata "(read your file into $filedata)";    
    $zipfile -> add_file($filedata"dir/file.txt");    

    // the next three lines force an immediate download of the zip file:  
    header("Content-type: application/octet-stream");    
    header("Content-disposition: attachment; filename=test.zip");    
    echo 
    $zipfile -> file();    


    // OR instead of doing that, you can write out the file to the loca disk like this:  
    $filename "output.zip";  
    $fd fopen ($filename"wb");  
    $out fwrite ($fd$zipfile -> file());  
    fclose ($fd);  

    // then offer it to the user to download:  
    <a href="output.zip">Click here to download the new zip file.</a>  

    ?>
     
  3. Vallez

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

    Joined:
    25 Dec 2005
    Messages:
    89
    Likes Received:
    19
    Reputations:
    -8
    Че то непашет.
     
  4. DIAgen

    DIAgen Banned Life!

    Joined:
    2 May 2006
    Messages:
    1,055
    Likes Received:
    374
    Reputations:
    460
    Этот класс нормально работает, просто разберись нормально как им пользоваться!
     
  5. DRON-ANARCHY

    DRON-ANARCHY Отец порядка

    Joined:
    4 Mar 2005
    Messages:
    716
    Likes Received:
    142
    Reputations:
    50
    а если через командную строку архивировать?