Autor Zpráva
Trav1s
Profil *
Zdravím, nemůžu přijít na to jak můžu v php zabalit několik jpg/gif/png souborů do ZIPu.. zatím sem se dostal jen sem:
$data = implode("", file("index.php"));
$gzdata = gzencode($data, 9);
$fp = fopen("bigfile.txt.gz", "a");
fwrite($fp, $gzdata);
fclose($fp);


To mi zabalí ale akorát ten jeden soubor a pokud tam chci přidat další, tak ho to prostě zapíše do toho co už tam je... navíc se ten zabalenej soubor automaticky jmenuje bigfile.txt podle názvu archivu a nevím jak mu změnit jméno..

Jak tedy můžu v php balit soubory do ZIPu? Díky
AM_
Profil
do ZIPu nebo GZIPu?
gzip umí jen jeden soubor, proto se často kombinuje s TARem (důvěrně známé .tar.gz), který spojí více souborů v jeden, ale nekomprimuje...

zkus si stáhnout pclzip.lib.php: http://www.phpclasses.org/browse/file/16043.html
a pak můžeš použít můj kód (pro balení adresářů):
<?php
function adddir(&$zip, $exclude = array(), $dir = '.'){
    $d = opendir($dir);
    while (false !== ($f = readdir($d))){
        if ($f == '.' || $f == '..') continue;
        $df = (empty($dir) || $dir == '.') ? $f : $dir.'/'.$f; 
        if (!in_array($df, $exclude))
            if (is_dir($df)){
                echo "Dir  : $df\n";
                adddir($zip, $exclude, $df); 
            } else {
                echo "File : $df\n";
                $zip->add($df);
            }
            flush();
    }
    closedir($d);     
}

require_once 'pclzip.lib.php';
if (is_file('.zip.exclude')){
    $exclude = explode("\n", str_replace(array("\r\n", "\r"), "\n", file_get_contents('.zip.exclude')));
} else {
    $exclude = array();
}
//if (isset($_GET['out'])) $outfile = str_replace(array('/', '\\', '..'), '', $_GET['out']); else $outfile = 'out.zip';
//more secure:
$outfile = 'out.zip';

$exclude[] = $outfile;
if (is_file($outfile)) unlink($outfile);
$zipFile = new PclZip($outfile);
header('content-type:text/plain;charset=utf-8');
adddir($zipFile, $exclude); 
 
?>
Yur4Y
Profil
Tvoj kód nepoužíva kompresiu zip, ale gzip, ktorá dokáže komprimovať iba jeden súbor (pre viac súborov sa použije najprv tar, čo je akýsi kontajner a až to sa gzipuje). Pre komprimáciu do formátu zip použi triedu ZipArchive alebo zip_* funkcie.
Alphard
Profil
Jestli chcete ZIP, mohlo by se hodit Nejčastější potíže s PHP (FAQ).
Trav1s
Profil *
Na tom jak to bude zabalené, nebo komprimované nezáleží, jde mi jen o to aby se několik souborů dalo stáhnout jako jeden velkej, aby se to nemuselo tahat po jednom a pak v počítači normálně rozbalit, jako je to v tom zipu třeba... takže jestli to správně chápu tak nejdřív bych měl vytvořit ty soubory v gzipu a potom je nějak spojit do TARu?

Pod čím mám na php.net hledat ty tar funkce? Vyhledávání mi tam nic nenašlo.
Nebo se to dělá jen nějak jednoduše, jako třeba že se jednotlivě načtou do file_get_contents a slepěj se pomocí .= dohromady a pak jen uložej pod příponou tar.gz?
Alphard
Profil
Trav1s:
Kdo to bude stahovat? ZIP rozbalí myslím i Windows XP SP2 bez dalších programů, takže jestli je to určené pro běžné uživatele, použil bych ZIP.
AM_
Profil
Trav1s:
nejdřív bych měl vytvořit ty soubory v gzipu a potom je nějak spojit do TARu?
pokud trváš na .tar.gz, tak přesně obráceně - spojit tarem a zabalit gzipem.

Pod čím mám na php.net hledat ty tar funkce?
nevím, tar nepoužívám. Součástí PHP ale asi zřejmě není.

Osobně si myslím, že kód, který jsem ti napsal, a zip knihovna, jsou
1) funkční
2) jednoduché
takže bych upřednostnil je...
Trav1s
Profil *
Tak nakonec bylo řešení strašně jednoduché, na php.net sem našel tento kód:

$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
    $zip->addFile('css/test.css', 'ttt.css');
    $zip->close();
    echo 'ok';
} else {
    echo 'failed';
}


který soubory přidává do toho nastaveného zip souboru (akorát nechápu jakto že to funguje když nemám v php.ini povolený php_zip.dll a přitom ho v popisu vyžadují

díky za rady

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0