Меняется кодировка в ZIPe

Discussion in 'PHP' started by am@tory, 6 Jul 2010.

  1. am@tory

    am@tory Elder - Старейшина

    Joined:
    8 Jan 2007
    Messages:
    65
    Likes Received:
    16
    Reputations:
    5
    Всем привет. При создании zip ахива, русские названия файлов, как я понял из CP1251 преобразуются в CP866. Как это можно поправить?

    index.php
    PHP:
    <?php
    require_once('createzip.php');
    require_once(
    'createzipfromdir.php');
    $createZip = new createDirZip;
    $createZip->get_files_from_folder('../folder_example/''');

    $fileName 'archive.zip';
    $fd fopen ($fileName'wb');
    $out fwrite ($fd$createZip->getZippedfile());
    fclose ($fd);

    $createZip->forceDownload($fileName);
    ?>
    createzip.php
    PHP:
    <?php

    /**
    * Class to dynamically create a zip file (archive)
    *
    * @author Rochak Chauhan
    */

    class createZip  {

        public 
    $compressedData = array();
        public 
    $centralDirectory = array(); // central directory
        
    public $endOfCentralDirectory "\x50\x4b\x05\x06\x00\x00\x00\x00"//end of Central directory record
        
    public $oldOffset 0;

        
    /**
         * Function to create the directory where the file(s) will be unzipped
         *
         * @param $directoryName string
         *
         */

        
    public function addDirectory($directoryName) {
            
    $directoryName str_replace("\\""/"$directoryName);

            
    $feedArrayRow "\x50\x4b\x03\x04";
            
    $feedArrayRow .= "\x0a\x00";
            
    $feedArrayRow .= "\x00\x00";
            
    $feedArrayRow .= "\x00\x00";
            
    $feedArrayRow .= "\x00\x00\x00\x00";

            
    $feedArrayRow .= pack("V",0);
            
    $feedArrayRow .= pack("V",0);
            
    $feedArrayRow .= pack("V",0);
            
    $feedArrayRow .= pack("v"strlen($directoryName) );
            
    $feedArrayRow .= pack("v");
            
    $feedArrayRow .= $directoryName;

            
    $feedArrayRow .= pack("V",0);
            
    $feedArrayRow .= pack("V",0);
            
    $feedArrayRow .= pack("V",0);

            
    $this -> compressedData[] = $feedArrayRow;

            
    $newOffset strlen(implode(""$this->compressedData));

            
    $addCentralRecord "\x50\x4b\x01\x02";
            
    $addCentralRecord .="\x00\x00";
            
    $addCentralRecord .="\x0a\x00";
            
    $addCentralRecord .="\x00\x00";
            
    $addCentralRecord .="\x00\x00";
            
    $addCentralRecord .="\x00\x00\x00\x00";
            
    $addCentralRecord .= pack("V",0);
            
    $addCentralRecord .= pack("V",0);
            
    $addCentralRecord .= pack("V",0);
            
    $addCentralRecord .= pack("v"strlen($directoryName) );
            
    $addCentralRecord .= pack("v");
            
    $addCentralRecord .= pack("v");
            
    $addCentralRecord .= pack("v");
            
    $addCentralRecord .= pack("v");
            
    $ext "\x00\x00\x10\x00";
            
    $ext "\xff\xff\xff\xff";
            
    $addCentralRecord .= pack("V"16 );

            
    $addCentralRecord .= pack("V"$this -> oldOffset );
            
    $this -> oldOffset $newOffset;

            
    $addCentralRecord .= $directoryName;

            
    $this -> centralDirectory[] = $addCentralRecord;
        }

        
    /**
         * Function to add file(s) to the specified directory in the archive
         *
         * @param $directoryName string
         *
         */

        
    public function addFile($data$directoryName)   {

            
    $directoryName str_replace("\\""/"$directoryName);

            
    $feedArrayRow "\x50\x4b\x03\x04";
            
    $feedArrayRow .= "\x14\x00";
            
    $feedArrayRow .= "\x00\x00";
            
    $feedArrayRow .= "\x08\x00";
            
    $feedArrayRow .= "\x00\x00\x00\x00";

            
    $uncompressedLength strlen($data);
            
    $compression crc32($data);
            
    $gzCompressedData gzcompress($data);
            
    $gzCompressedData substrsubstr($gzCompressedData0strlen($gzCompressedData) - 4), 2);
            
    $compressedLength strlen($gzCompressedData);
            
    $feedArrayRow .= pack("V",$compression);
            
    $feedArrayRow .= pack("V",$compressedLength);
            
    $feedArrayRow .= pack("V",$uncompressedLength);
            
    $feedArrayRow .= pack("v"strlen($directoryName) );
            
    $feedArrayRow .= pack("v");
            
    $feedArrayRow .= $directoryName;

            
    $feedArrayRow .= $gzCompressedData;

            
    $feedArrayRow .= pack("V",$compression);
            
    $feedArrayRow .= pack("V",$compressedLength);
            
    $feedArrayRow .= pack("V",$uncompressedLength);

            
    $this -> compressedData[] = $feedArrayRow;

            
    $newOffset strlen(implode(""$this->compressedData));

            
    $addCentralRecord "\x50\x4b\x01\x02";
            
    $addCentralRecord .="\x00\x00";
            
    $addCentralRecord .="\x14\x00";
            
    $addCentralRecord .="\x00\x00";
            
    $addCentralRecord .="\x08\x00";
            
    $addCentralRecord .="\x00\x00\x00\x00";
            
    $addCentralRecord .= pack("V",$compression);
            
    $addCentralRecord .= pack("V",$compressedLength);
            
    $addCentralRecord .= pack("V",$uncompressedLength);
            
    $addCentralRecord .= pack("v"strlen($directoryName) );
            
    $addCentralRecord .= pack("v");
            
    $addCentralRecord .= pack("v");
            
    $addCentralRecord .= pack("v");
            
    $addCentralRecord .= pack("v");
            
    $addCentralRecord .= pack("V"32 );

            
    $addCentralRecord .= pack("V"$this -> oldOffset );
            
    $this -> oldOffset $newOffset;

            
    $addCentralRecord .= $directoryName;

            
    $this -> centralDirectory[] = $addCentralRecord;
        }

        
    /**
         * Fucntion to return the zip file
         *
         * @return zipfile (archive)
         */

        
    public function getZippedfile() {

            
    $data implode(""$this -> compressedData);
            
    $controlDirectory implode(""$this -> centralDirectory);

            return
                
    $data.
                
    $controlDirectory.
                
    $this -> endOfCentralDirectory.
                
    pack("v"sizeof($this -> centralDirectory)).
                
    pack("v"sizeof($this -> centralDirectory)).
                
    pack("V"strlen($controlDirectory)).
                
    pack("V"strlen($data)).
                
    "\x00\x00";
        }

        
    /**
         *
         * Function to force the download of the archive as soon as it is created
         *
         * @param archiveName string - name of the created archive file
         */

        
    public function forceDownload($archiveName) {
            
    $headerInfo '';

            if(
    ini_get('zlib.output_compression')) {
                
    ini_set('zlib.output_compression''Off');
            }

            
    // Security checks
            
    if( $archiveName == "" ) {
                echo 
    "<html><title>Public Photo Directory - Download </title><body><BR><B>ERROR:</B> The download file was NOT SPECIFIED.</body></html>";
                exit;
            }
            elseif ( ! 
    file_exists$archiveName ) ) {
                echo 
    "<html><title>Public Photo Directory - Download </title><body><BR><B>ERROR:</B> File not found.</body></html>";
                exit;
            }

            
    header("Pragma: public");
            
    header("Expires: 0");
            
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            
    header("Cache-Control: private",false);
            
    header("Content-Type: application/zip");
            
    header("Content-Disposition: attachment; filename=".basename($archiveName).";" );
            
    header("Content-Transfer-Encoding: binary");
            
    header("Content-Length: ".filesize($archiveName));
            
    readfile("$archiveName");

         }

    }
    ?>
    createzipfromdir.php
    PHP:
    <?php
    class createDirZip extends createZip {

      function 
    get_files_from_folder($directory$put_into) {
        if (
    $handle opendir($directory)) {
          while (
    false !== ($file readdir($handle))) {
            if (
    is_file($directory.$file)) {
              
    $fileContents file_get_contents($directory.$file);
              
    $this->addFile($fileContents$put_into.$file);
            } elseif (
    $file != '.' and $file != '..' and is_dir($directory.$file)) {
              
    $this->addDirectory($put_into.$file.'/');
              
    $this->get_files_from_folder($directory.$file.'/'$put_into.$file.'/');
            }
          }
        }
        
    closedir($handle);
      }
    }
    ?>