• ----:)欢迎访问源码网(:----
    • 首页
    • 博客
    • 学院
    • 下载
    • 论坛
    • 影视
    • 发布源码
    • RSS
    • ITPig
    • 笑话网
    • 百家姓
    • 繁體中文

源码网 - 中国第一源码门户
选择镜像:网通镜像 - 电信主站
  • 首 页
  • 新闻动态
  • 网站运营
  • 网页制作
  • WEB开发
  • 编程开发
  • 图像媒体
  • 操作系统
  • 数据库
  • 服务器
热门搜索 优化 SEO 故事 cms IIS7 MySQL 个人 AdSense 主题推广 | 文章搜索: 高级搜索
会员登录/控制面版您的位置: 学院首页 >> WEB开发 >> PHP 开发 >> PHP代码 >> 详细内容
 

推荐文章

 
 

热点文章

  • 3389远程服务器GHOST的视频教程
  • 利用纯真QQIP数据库做快速IP归属地查询
  • 天气预报小偷,根据IP自动判断地址
  • php在线文本编辑器
  • 实例(Smarty+FCKeditor新闻系统)
  • php里实现汉字转区位码
  • 对dvbbs.php 全文搜索的完全分析
  • php生成会动的gif图片代码
  • php的字符编码转换工具
  • DIV+CSS+PHP巨献——网页内容先竖排再横排
  • PHP获取网卡的MAC地址
  • 56.com视频采集接口程序(PHP)
 
 

相关文章

  • PHP初级程序员面试题及答案
  • PHP使用zlib扩展实现页面GZIP压缩输出
  • 为什么PHP令人不爽(对于大型系统)
  • php中的stdClass
  • php中ADODB类使用
  • php自动post数据--百度贴吧灌水机器人代码实例
  • Linux/FreeBSD下用C语言开发PHP的so扩展模块例解
  • php取不到session的常见原因
  • 使用php的zlib压缩和解压缩swf文件
  • php 做服务器端程序
  • PHP5.2下function和class性能对比
  • PHP用mkdir()新建立目录无写的权限的问题
 
 

百度搜索

 
 

PHP的ZIP压缩类

  • 阅览次数:
  • 文章来源: CP整理
  • 原文作者:
  • 整理日期: 2008-08-14
  • 发表评论
  • 字体大小:
  • 小
  • 中
  • 大


<?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 <[email]eric@themepark.com[/email]>
*
*  [url]http://www.zend.com/codex.php?id=470&single=1[/url]
*  by Denis125 <[email]webmaster@atlant.ru[/email]>
*
*  a patch from Peter Listiak <[email]mlady@users.sourceforge.net[/email]> 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


    /**
     * 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($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;

        
// "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', 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
        
$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
?>

使用例子
PHP:  

<?php
include("zip.lib.php");
$ziper = new zipfile();
$ziper->addFiles(array("mypdf.pdf","file.png"));  //array of files
$ziper->output("myzip.zip");
?>

上一篇:PayPal全中文详解
下一篇:PHP初级程序员面试题及答案
  • 网友评论:
  • 查看所有评论
  • 我要发表评论
您的网名:
留言主题:
你要发表的内容:

 

关于本站 | 广告联系 | 版权声明 | 网站地图 | 发布软件 | 帮助中心 | 源码论坛

Copyright © 2005-2007 CodePub.Com  程序支持:木翼  滇ICP备05005971号