Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Trinità76
    Registrato dal
    Jan 2002
    Messaggi
    1,439

    [php] Creare zip sul server... non riesco a includere i files senza estenzione

    Salve, premesso che ho seguito le istruzioni su questo thread:
    http://forum.html.it/forum/showthrea...ostid=12215832
    usando la libreria ic.zip.php (http://www.web-works.it/2008/08/zipp...rtella-in-php/)

    Ho modificato il codice della libreria perchè generava alcuni warning in questo:
    ic.zip.php
    Codice PHP:
    <?php
    include("zip.lib.php");

    ini_set("memory_limit","500M");

    define("SZIP_DUMP",'dump');
    define("SZIP_FILE",'file');
    define("SZIP_SAVE",'save');

    # ======
    # INIZIALIZZAZIONE DELLA CLASSE 

    class iczip 
    {
        var 
    $zip;
        var 
    $options;
        var 
    $base_dir;

        function 
    iczip($warn true$safe true)
        {
            
    $this->zip = new zipfile;
            
    $this->options['warn'] = $warn;
            
    $this->options['safe'] = $safe;
        }

    # ======
    # ADATTA UNA DIRECTORY IN MANIERA RICORSIVA

        
    function addDirRecursive($dir)
        {
            
    //Aggiusto la directory
            
    $str_tot strlen($dir);
            if (
    $dir[$str_tot-1] == '/')
            {
                
    $dir_app $dir;
                
    //unset($dir);
                
    $dir '';
                for(
    $i=0;$i<($str_tot-1);$i++)
                    
    $dir .= $dir_app[$i];
            }
        
            if(
    $this->base_dir == NULL)
            {
                
    $folders split("/"$dir);
                
    $last count($folders);
                
    $this->zip->addDir($folders[$last-1]);
                for(
    $i=0;$i<($last-1);$i++)
                {
                    if(
    $i!=0)    
                        
    $this->base_dir .= "/".$folders[$i];
                    else
                        
    $this->base_dir .= $folders[$i];
                }
                
            }
            
    $arr=$this->ls_a($dir);
            foreach (
    $arr as $fn)
            {
                if(
    $fn)
                {
                    if(
    is_dir("$dir/$fn"))
                    {
                        
    $this->zip->addDir(str_replace($this->base_dir."/"''"$dir/$fn"));
                        
    $this->addDirRecursive("$dir/$fn");
                    }
                    else
                    {
                        
    $fname str_replace($this->base_dir."/"''"$dir/$fn");
                        
    $this->zip->addFile(implode('',file("$dir/$fn")),$fname);
                    }
        
                }
            }
        }


    # ======
    # FUNZIONE DI APPOGGIO X addDirRecursive()
        
    function ls_a($dir)
        {
            if (
    $handle opendir($dir))
            {
                while (
    false!== ($file readdir($handle)))
                {
                    if (
    $file!= "." && $file!= ".." )
                    {
                        
    //if(!$files) $files="$file";
              
    if(!isset($files)) $files="$file";
                        else 
    $files="$file\n$files";
                    }
                }
            
    closedir($handle);
            }
            
    $arr=explode("\n",$files);
            return 
    $arr;
        }
    # ======
    # ADATTA UN SINGOLO FILE

        
    function addSingeFile($file)
        {
            if(
    is_file($file))
            {
                
    $folders split("/"$file);
                
    $last count($folders);
                
    $file_name $folders[$last-1];
                
    $this->zip->addFile(implode('',file($file)),$file_name);
            }    
        } 
    # ======
    # CREAZIONE DEL FILE ZIPPATO

        
    function render($file,$type 'dump')
        {
            if (
    $type == 'dump')
            {
                
    header('Content-type: application/zip');
                
    header('Content-Disposition: attachment; filename="'.$file.'"');
                echo 
    $this->zip->file();
            }
            elseif (
    $type == 'save')
            {
                @
    unlink($file);
                
    $f fopen($file,'a+');
                
    fwrite($f,$this->zip->file());
                
    fclose($f);
            }
        }

    }
    ?>
    わさび

  2. #2
    Utente di HTML.it L'avatar di Trinità76
    Registrato dal
    Jan 2002
    Messaggi
    1,439
    zip.lib.php
    Codice PHP:
    <?php
    /* $Id: zip.lib.php,v 1.1 2004/02/14 15:21:18 anoncvs_tusedb Exp $ */
    // vim: expandtab sw=4 ts=4 sts=4:


    /**
    * Zip file creation class.
    * Makes zip files.
    * Last Modification and Extension By :
    *  Hasin Hayder
    *  HomePage : [url]www.hasinme.info[/url]
    *  Email : [email]countdraculla@gmail.com[/email]
    *  IDE : PHP Designer 2005
    * Originally Based on :
    *  [url]http://www.zend.com/codex.php?id=535&single=1[/url]
    *  By Eric Mueller <eric@themepark.com>
    *  [url]http://www.zend.com/codex.php?id=470&single=1[/url]
    *  by Denis125 <webmaster@atlant.ru>
    *  a patch from Peter Listiak <mlady@users.sourceforge.net> for last modified
    *  date and time of the compressed file
    * Official ZIP file format: [url]http://www.pkware.com/appnote.txt[/url]
    * @access  public
    */
    class zipfile
    {
        
    /**
         * Array to store compressed data
         * @var  array    $datasec
         */
        
    var $datasec      = array();

        
    /**
         * Central directory
         * @var  array    $ctrl_dir
         */
        
    var $ctrl_dir     = array();

        
    /**
         * End of central directory record
         * @var  string   $eof_ctrl_dir
         */
        
    var $eof_ctrl_dir "\x50\x4b\x05\x06\x00\x00\x00\x00";

        
    /**
         * Last offset position
         * @var  integer  $old_offset
         */
        
    var $old_offset   0;


        
    /**
         * Converts an Unix timestamp to a four byte DOS date and time format (date
         * in high two bytes, time in low two bytes allowing magnitude comparison).
         * @param  integer  the current Unix timestamp
         * @return integer  the current date in a four byte DOS format
         * @access private
         */
        
    function unix2DosTime($unixtime 0) {
            
    $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);

            if (
    $timearray['year'] < 1980) {
                
    $timearray['year']    = 1980;
                
    $timearray['mon']     = 1;
                
    $timearray['mday']    = 1;
                
    $timearray['hours']   = 0;
                
    $timearray['minutes'] = 0;
                
    $timearray['seconds'] = 0;
            } 
    // end if

            
    return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
                    (
    $timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
        } 
    // end of the 'unix2DosTime()' method

        
    function addDir($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",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",0); //crc32 
            
    $fr .= pack("V",0); //compressed filesize
            
    $fr .= pack("V",0); //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]

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


        }


        
    /**
         * Adds "file" to archive
         * @param  string   file contents
         * @param  string   name of the file in the archive (may contains the path)
         * @param  integer  the current timestamp
         * @access public
         */
        
    function addFile($data$name$time 0)
        {
            
    $name     str_replace('\\''/'$name);

            
    $dtime    dechex($this->unix2DosTime($time));
            
    $hexdtime '\x' $dtime[6] . $dtime[7]
                      . 
    '\x' $dtime[4] . $dtime[5]
                      . 
    '\x' $dtime[2] . $dtime[3]
                      . 
    '\x' $dtime[0] . $dtime[1];
            eval(
    '$hexdtime = "' $hexdtime '";');

            
    $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   .= $hexdtime;             // last mod time and date

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

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

            
    // 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 .= $hexdtime;                 // 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
            
    $this -> old_offset += strlen($fr);

            
    $cdrec .= $name;

            
    // optional extra field, file comment goes here
            // save to central directory
            
    $this -> ctrl_dir[] = $cdrec;
        } 
    // end of the 'addFile()' method


        /**
         * Dumps out file
         * @return  string  the zipped file
         * @access public
         */
        
    function 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
        
    // end of the 'file()' method


        /**
         * A Wrapper of original addFile Function
         * Created By Hasin Hayder at 29th Jan, 1:29 AM
         * @param array An Array of files with relative/absolute path to be added in Zip File
         * @access public
         */
        
    function addFiles($files /*Only Pass Array*/)
        {
            foreach(
    $files as $file)
            {
            if (
    is_file($file)) //directory check
            
    {
                
    $data implode("",file($file));
                        
    $this->addFile($data,$file);
                    }
            }
        }

        
    /**
         * A Wrapper of original file Function
         * Created By Hasin Hayder at 29th Jan, 1:29 AM
         * @param string Output file name
         * @access public
         */
        
    function output($file)
        {
            
    $fp=fopen($file,"w");
            
    fwrite($fp,$this->file());
            
    fclose($fp);
        }



    // end of the 'zipfile' class
    ?>
    Il problema è, come da topic, la classe funziona piuttosto bene ora, ma i files senza estenzione vengono ignorati... qualcuno saprebbe indicarmi come correggerla per includerli?

    il mio caso
    Codice PHP:
    // Inizializziamo la classe
    $myDocument = new iczip();

    // add files
    $myDocument->addDirRecursive'Pictures/' ); // ok
    $myDocument->addSingeFile'meta.xml' ); // ok
    $myDocument->addSingeFile'mimetype' ); // NON ok

    // output zip
    $myDocument->render'archive.zip''save' ); 
    わさび

  3. #3
    Utente bannato
    Registrato dal
    Jul 2007
    Messaggi
    368
    Avere files senza estensione non è un buona idea (in generale). Consiglio di farglieli rinominare con qualcosa tipo nomefile.boh.

  4. #4
    Utente di HTML.it L'avatar di Trinità76
    Registrato dal
    Jan 2002
    Messaggi
    1,439
    Originariamente inviato da marcoocram
    Avere files senza estensione non è un buona idea (in generale). Consiglio di farglieli rinominare con qualcosa tipo nomefile.boh.
    Lo so, ma purtroppo mi serve proprio così... Mi serve aggiungere un file senza estensione per un'applicazione che sto facendo... qualche idea sul come fare?
    わさび

  5. #5
    Utente di HTML.it L'avatar di Trinità76
    Registrato dal
    Jan 2002
    Messaggi
    1,439
    uppatina
    ho anche provato altre due classi, ma nessuna mi aggiunge i file senza estensione...
    わさび

  6. #6
    Utente di HTML.it L'avatar di Trinità76
    Registrato dal
    Jan 2002
    Messaggi
    1,439
    aiuto please
    ho provato tutte le classi su phpclasses e nessuna prevede questa cosa...
    わさび

  7. #7
    Utente bannato
    Registrato dal
    Jul 2007
    Messaggi
    368
    Potresti fare in modo tale che l' estensione venga aggiunta solo quando serve e tolta quando non serve.

  8. #8
    Utente di HTML.it L'avatar di Trinità76
    Registrato dal
    Jan 2002
    Messaggi
    1,439
    Originariamente inviato da marcoocram
    Potresti fare in modo tale che l' estensione venga aggiunta solo quando serve e tolta quando non serve.
    ehm... ossia?
    nel mio caso dovrò aggiungere allo zip oltre mille files, di cui uno solo non ha estensione...
    わさび

  9. #9
    Utente di HTML.it L'avatar di Trinità76
    Registrato dal
    Jan 2002
    Messaggi
    1,439
    uppete
    わさび

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.