Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    creare file zip (archivi) con PHP

    Salve a tutti!
    Mi sto imbattendo in un contesto a me abbastanza nuovo...la creazione di file archivio (quindi backup) a partire da un elenco di file PDF presenti sul server.
    Il problema è questo: eseguire un backup dei dati. Quando l'aministratore clicca sul link apposito parte lo script che deve leggere tutti i file presenti nella cartella "/file_pdf/", e per ognuno dei file lo legge e lo scrive in un file archivio bz2, il quale può essere scaricato via HTTP e messo nella cartella "/file_pdf/backup/".
    Ho fatto lo script, e funziona, ma il risultato finale è stato che ho un file XXX.bz2 (l'archivio) con dentro un unico file senza estensione...e non una lista di file pdf ...
    come posso fare a dire alle funzioni bzip2 di "chiudere" un file per cominciare un altro, in modo che siano leggibili separatamente?

    In pratica devo simulare (lato server e in maniera del tutto automatica ed indipendente) la funzione "Add to zip file..." che prende quell'elenco di file e li mette dentro ad un file compresso (spesso .zip).

    Ringrazio in anticipo.
    Fabrizio.

    P.S.: visto che sono per l'open source...vi posto il codice che ho scritto...in modo che possiarte rendervi conto di quello che ho fatto...e magari di cosa non ho fatto
    Codice PHP:
    class Backup {
        var 
    $arrayFile;
        var 
    $fileBZ2;
        
        function 
    Backup() {
            
    $this->arrayFile = array();
            
    $connDB = new ConnessioneDB();
            
    $res $connDB->query("SELECT file FROM chiamate WHERE file<>'' ORDER BY file ASC;");
            
    $i=0;
            while (
    $fetch $connDB->fetchObject($res)) {
                
    $this->arrayFile[$i] = $fetch->file;
                
    $i++;
            }
            
    print_r($this->arrayFile);
        }
        function 
    getCount() { return count($this->arrayFile); }
        function 
    backupFiles() {
            
    $dataOra = new DataOraSQL(getdate());
            
    $dataOraSQL substr(str_replace(":""-"str_replace(" ""_"$dataOra->codificaDataOra())),0,count($dataOra->codificaDataOra())-4);
            foreach (
    $this->arrayFile as $file) {
                
    $fileCompleto "../file_pdf/".$file;
                
    $outCompleto "../file_pdf/backup/".$dataOraSQL.".bz2";
                if (!
    file_exists ($fileCompleto) || !is_readable ($fileCompleto))
                    return 
    false;
                if ((!
    file_exists ($outCompleto) && !is_writeable (dirname ($outCompleto)) || (file_exists($outCompleto) && !is_writable($outCompleto)) ))
                    return 
    false;
                
    $in_file fopen ($fileCompleto"rb");
                
    $out_file bzopen ($outCompleto"wb");
                while (!
    feof ($in_file)) {
                    
    $buffer fgets ($in_file4096);
                    
    bzwrite ($out_file$buffer4096);
                }
            }
            
    fclose ($in_file);
            
    bzclose ($out_file);
            
    $this->fileBZ2 $dataOraSQL.".bz2";
            return 
    true;
        }
        function 
    getFileBZ2() { return $this->fileBZ2; }

    notate che dentro al codice ho usato due classi mie (ConnessioneDB e DataOra) ma si può capire facilmente a cosa servano...... :berto:

    Ciao ciao!!

  2. #2
    ho trovato una pillola interessante:
    http://forum.html.it/forum/showthrea...postid=4174481
    solo che nell'usare la classe zipfile ricevo degli errori...
    Notice: Undefined variable: crc in /Volumes/Archivio/web/DocumentRoot/cemass/include_zipfile.php on line 62

    Notice: Undefined variable: c_len in /Volumes/Archivio/web/DocumentRoot/cemass/include_zipfile.php on line 63

    Notice: Undefined variable: unc_len in /Volumes/Archivio/web/DocumentRoot/cemass/include_zipfile.php on line 64

    Warning: crc32() expects parameter 1 to be string, resource given in /Volumes/Archivio/web/DocumentRoot/cemass/include_zipfile.php on line 122

    Warning: crc32() expects parameter 1 to be string, resource given in /Volumes/Archivio/web/DocumentRoot/cemass/include_zipfile.php on line 122

    Warning: crc32() expects parameter 1 to be string, resource given in /Volumes/Archivio/web/DocumentRoot/cemass/include_zipfile.php on line 122
    come cavolo faccio?!!?
    non funziona la classe di Zend! ma porc....

  3. #3
    forse sbaglio io ad usare la classe?

    infatti non avevo benc apito questa riga nella pillola:

    $filedata = "(read your file into $filedata)";
    nella pillola viene comunicato "All'interno di filedata và inserito il contenuto del file che verrà creato in seguito"
    bene...ma come lo inserisco?
    io l'ho fatto con
    $filedata = fopen($fileCompleto, "rb");
    $zipfile -> add_file($filedata, "../file_pdf/".$file);
    $fileCompelto è il percorso preciso al file, ovvero "../file_pdf/nomefile.pdf"
    ed in effetti, facendo un
    if ($filedata) echo "filedata OK";
    else "filedata NON ok...";
    il risultato è "filedata OK", quindi vuol dire che legge il file correttamente. :berto:

    cmq il file zip viene creato...
    ha dimensione 4KB (i 3 file pdf che devono stare nel zip pesano in tutto 252KB)
    e non è unzippabile...ricevo un errore durante la fase di apertura del file.

    qualche idea?

  4. #4
    ho trovato una PARZIALE soluzione...

    $handleFile = fopen($fileCompleto, "rb");
    $filedata = fread($handleFile, filesize($fileCompleto));
    $zipfile -> add_file($filedata, "../file_pdf/".$file);

    in modo che $filedata sia un resource di fread e non fopen.....forse era quello il prob
    fatto sta che adesso il file zip me lo crea di dimensioni ragionevoli (224KB, che sembrerebbero i 3 pdf da 252KB totali, ma compressi) ma non me lo fa aprire, mi da errore...ed inoltre ricevo questi errori dalla classe:

    Notice: Undefined variable: crc in /Volumes/Archivio/web/DocumentRoot/cemass/include_zipfile.php on line 62

    Notice: Undefined variable: c_len in /Volumes/Archivio/web/DocumentRoot/cemass/include_zipfile.php on line 63

    Notice: Undefined variable: unc_len in /Volumes/Archivio/web/DocumentRoot/cemass/include_zipfile.php on line 64

    HELP!!!
    so che manca poco...lo sento!!

  5. #5
    vi riporto qui di seguito il codice della mia classe Backup:
    Codice PHP:
    class Backup {
        var 
    $arrayFile;
        var 
    $fileZip;
        
        function 
    Backup() {
            require_once 
    "include_zipfile.php";
            
    $this->arrayFile = array();
            
    $i=0;
            if (
    $handle opendir("../file_pdf")) {
                echo 
    "<p style=\"border:1px solid #ccc;\">[b]Elenco dei file nella cartella &quot;file_pdf&quot;:[/b]
    "
    ;
                while (
    false !== ($file readdir($handle)) ) {
                    if (
    $file != "." && $file != ".." && $file != ".DS_Store") {
                        echo 
    "[i]".($i+1).":[/i] ".$file."
    "
    ;
                        
    $this->arrayFile[$i] = $file;
                        
    $i++;
                    }
                }
                echo 
    "</p>";
                
    closedir($handle);
            }
        }
        function 
    getCount() { return count($this->arrayFile); }
        function 
    backupFiles() {
            
    $zipfile = new zipfile();
            
    $zipfile->add_dir("../file_pdf/");
            
    $dataOra = new DataOraSQL(getdate());
            
    $dataOraSQL substr(str_replace(":""-"str_replace(" ""_"$dataOra->codificaDataOra())),0,count($dataOra->codificaDataOra())-4);
            foreach (
    $this->arrayFile as $file) {
                
    $fileCompleto "../file_pdf/".$file;
                
    $outCompleto "../backup/".$dataOraSQL.".zip";
                if (!
    file_exists ($fileCompleto) || !is_readable ($fileCompleto))
                    return 
    false;
                if ((!
    file_exists ($outCompleto) && !is_writeable (dirname ($outCompleto)) || (file_exists($outCompleto) && !is_writable($outCompleto)) ))
                    return 
    false;
                
    $handleFile fopen($fileCompleto"rb");
                
    $filedata fread($handleFilefilesize($fileCompleto));
    //            $filedata = fopen($fileCompleto, "rb");
                
    $zipfile -> add_file($filedata"../file_pdf/".$file);
            }
            
    $filename $outCompleto;
            
    $fd fopen($filename"wb");
            
    $out fwrite($fd$zipfile -> file());
            
    fclose($fd);
            
    $this->fileZip $dataOraSQL.".zip";
            return 
    true;
        }
        function 
    getFileZip() { return $this->fileZip; }

    ed anche il codice della class zipfile della pillola in questione:
    Codice 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
    [url="http://www.themepark.com"][url]http://www.themepark.com[/url][/url]

    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]webmaster@atlant.ru[/email], [url="http://www.atlant.ru"][url]http://www.atlant.ru[/url][/url]

    */

    // official ZIP file format: [url="http://www.pkware.com/appnote.txt"][url]http://www.pkware.com/appnote.txt[/url][/url]

    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"); //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 [url="http://support.microsoft.com/support/kb/articles/Q125/0/19.asp"][url]http://support.microsoft.com/suppor...s/Q125/0/19.asp[/url][/url]

            // 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"); //extra field length    
            
    $cdrec .= pack("v"); //file comment length
            
    $cdrec .= pack("v"); //disk number start
            
    $cdrec .= pack("v"); //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);    ho dovuto commentarlo perchè interpreta male il "/" e da errore!
            //$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 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 "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"); //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
    ";
            
    $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
        }


  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    613
    Non so di che dimensioni siano i tuoi file ma attento alla memoria che utilizzi.
    Il metodo secondo me da un sacco di problemi.

    l'ho affrontato fino a ieri, vedi se questo può esserti utile

    http://forum.html.it/forum/showthrea...readid=1058873

    Vedi l'ultima pagina, c'è la soluzione... questo è fatto per mandare file zip di grosse dimensioni in download senza dover lasciare il file sul server.

    Ciao

    P.S. dimenticavo che funziona su un server Linux...
    Conosci te stesso(?)
    (..e allora perchè scassi a me? )

  7. #7
    grazie mille!
    ho risolto facendo l'exec di zip -j ...era quello che mi serviva!
    poi lascerò decidere all'admin se cancellare o meno quel file..se lasciarlo sul server o se scaricarlo e cancellarlo...

    GRAZIE

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    613
    Vediti anche le opzioni di zip, con -j toglio l'inclusione della struttura di cartelle.

    A buon rendere, ciao ciao
    Conosci te stesso(?)
    (..e allora perchè scassi a me? )

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.