Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Файлы в архив, zlib 
:(
    Опции темы
lancelot555
  Дата 23.7.2005, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 19.2.2005

Репутация: нет
Всего: нет



Народ help!!!
Есть массив содержащий имена файлов которые нужно заархивировать в архив и передать пользователю. Вопрос как загнать в архив несколько файлов?

Вот функция которая архивирует один файл в один архив:

Код

<?php

$filename = tempnam('/tmp', 'zlibtest') . '.gz';
echo "<html>\n<head></head>\n<body>\n<pre>\n";
$s = "Only a test, test, test, test, test, test, test, test!\n";

// open file for writing with maximum compression
$zp = gzopen($filename, "w9");

// write string to file
gzwrite($zp, $s);

// close file
gzclose($zp);

// open file for reading
$zp = gzopen($filename, "r");

// read 3 char
echo gzread($zp, 3);

// output until end of the file and close it.
gzpassthru($zp);
gzclose($zp);

echo "\n";

// open file and print content (the 2nd time).
if (readgzfile($filename) != strlen($s)) {
       echo "Error with zlib functions!";
}
unlink($filename);
echo "</pre>\n</body>\n</html>\n";

?>


Вот класс который должен архивировать файлы и даже директории в один архив, но что то он создает нерабочие архивы...
Код

<?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, [email protected], 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 = "x50x4bx05x06x00x00x00x00"; //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 = "x50x4bx03x04"; 
        $fr .= "x0ax00";    // ver needed to extract 
        $fr .= "x00x00";    // gen purpose bit flag 
        $fr .= "x00x00";    // compression method 
        $fr .= "x00x00x00x00"; // 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", 0 ); //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 = "x50x4bx01x02"; 
        $cdrec .="x00x00";    // version made by 
        $cdrec .="x0ax00";    // version needed to extract 
        $cdrec .="x00x00";    // gen purpose bit flag 
        $cdrec .="x00x00";    // compression method 
        $cdrec .="x00x00x00x00"; // 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", 0 ); //extra field length    
        $cdrec .= pack("v", 0 ); //file comment length 
        $cdrec .= pack("v", 0 ); //disk number start 
        $cdrec .= pack("v", 0 ); //internal file attributes 
        $ext = "x00x00x10x00"; 
        $ext = "xffxffxffxff";   
        $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 = "x50x4bx03x04"; 
        $fr .= "x14x00";    // ver needed to extract 
        $fr .= "x00x00";    // gen purpose bit flag 
        $fr .= "x08x00";    // compression method 
        $fr .= "x00x00x00x00"; // last mod time and date 

        $unc_len = strlen($data);   
        $crc = crc32($data);   
        $zdata = gzcompress($data);   
        $zdata = substr( substr($zdata, 0, strlen($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;   
        // 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 = "x50x4bx01x02"; 
        $cdrec .="x00x00";    // version made by 
        $cdrec .="x14x00";    // version needed to extract 
        $cdrec .="x00x00";    // gen purpose bit flag 
        $cdrec .="x08x00";    // compression method 
        $cdrec .="x00x00x00x00"; // 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", 0 ); //extra field length    
        $cdrec .= pack("v", 0 ); //file comment length 
        $cdrec .= pack("v", 0 ); //disk number start 
        $cdrec .= pack("v", 0 ); //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 
            "x00x00";                             // .zip file comment length 
    } 
}   

?>


<?php 
$f=fopen("t.jpg","r");
$filedata=fread($f,1000000);
fclose($f);

$zipfile = new zipfile();   

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

// add the binary data stored in the string 'filedata' 
#$filedata = "(read your file into $filedata)";   
$zipfile -> add_file($filedata, "t.jpg");   

// the next three lines force an immediate download of the zip file: 
#header("Content-type: application/octet-stream");   
#header("Content-disposition: attachment; filename=output.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> 



Помогите примером как загнать несколько файлов в архив...
Может кому-то удасться отладить класс... smile
--------------------
Hи что так не поpтит цель, как попадание! =)
PM MAIL   Вверх
Mal Hack
Дата 23.7.2005, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



А почему бы не заюзать вызов через system??
Несколко файлов надо в TAR запихивать, а потом уже GZ
PM ICQ   Вверх
lancelot555
Дата 23.7.2005, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 19.2.2005

Репутация: нет
Всего: нет



Цитата(Mal @ 23.7.2005, 13:08)
А почему бы не заюзать вызов через system??
Несколко файлов надо в TAR запихивать, а потом уже GZ


Пробовал, не работает...
Да и этот вариант вроде как "некрасив" и скорее всего не будет работать на всех серверах...
--------------------
Hи что так не поpтит цель, как попадание! =)
PM MAIL   Вверх
Mal Hack
Дата 23.7.2005, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Цитата(lancelot555 @ 23.7.2005, 14:51)
Пробовал, не работает...

Что пишет??
PM ICQ   Вверх
lancelot555
Дата 23.7.2005, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 19.2.2005

Репутация: нет
Всего: нет



Ничего не пишет, пустой экран... кстати напиши полностью команду...
Может не хватает какого-то модуля, библиотеки или exe-шника
я запускал примерно так:
system("gzip t.jpg ggg.gz"); и так
exec("tar cfzv blablabla.tar.gz tmp");

Нашел другой метод. С помощью PEAR. Там есть пакет Tar.php
Примерно так:
Код

require_once "Tar.php"; 
$zip_arch= & new Archive_Tar("myzip.tar.gz"); 
$p_filelist="tmp"; // список файлов через запятую 
$zip1 = $zip_arch->create($p_filelist, $p_params=0);// создаем непосредственно архив 


Но опять же глюки: Если указывать диапазон файлов, то архивируется только последний, а если указать директорию то она архивируется полностью, как и положено...

С помощью zlib вообще не получается даже архив открыть( zip_open )(Пишет что-то вроде can't open), хотя модуль zlib подключен...

Это сообщение отредактировал(а) lancelot555 - 23.7.2005, 17:20
--------------------
Hи что так не поpтит цель, как попадание! =)
PM MAIL   Вверх
logiciel
Дата 6.7.2006, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 5.7.2006

Репутация: нет
Всего: нет



Create ZIP file. У мeня работаeт бeз проблeм (ну, почти).

http://www.phpclasses.org/browse/package/2322.html 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Extensions | Следующая тема »


 




[ Время генерации скрипта: 0.0508 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.