-
php文件在线压缩程序类
提供一款超完美的php文件在线压缩程序,原理很简单就是把文件以二进制形式保存了,以前用过利用rar的内核程序,这是php自带的压缩功能,实例代码如下:
- set_time_limit(0);
- class phpzip{
- var $file_count = 0 ;
- var $datastr_len = 0;
- var $dirstr_len = 0;
- var $filedata = ''; //该变量只被类外部程序访问
- var $gzfilename;
- var $fp;
- var $dirstr='';
- /*
- 返回文件的修改时间格式.
- 只为本类内部函数调用.
- */
- 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;
- }
- return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
- ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
- }
- /*
- 初始化文件,建立文件目录,
- 并返回文件的写入权限.
- */
- function startfile($path = 'faisun.zip'){
- $this->gzfilename=$path;
- $mypathdir=array();
- do{
- $mypathdir[] = $path = dirname($path);
- }while($path != '.');
- @end($mypathdir);
- do{
- $path = @current($mypathdir);
- @mkdir($path);
- }while(@prev($mypathdir));
- if($this->fp=@fopen($this->gzfilename,"w")){
- return true;
- }
- return false;
- }
- /*
- 添加一个文件到 zip 压缩包中.
- */
- function addfile($data, $name){
- $name = str_replace('\', '/', $name);
- if(strrchr($name,'/')=='/') return $this->adddir($name);
- $dtime = dechex($this->unix2dostime());
- $hexdtime = 'x' . $dtime[6] . $dtime[7]
- . 'x' . $dtime[4] . $dtime[5]
- . 'x' . $dtime[2] . $dtime[3]
- . 'x' . $dtime[0] . $dtime[1];
- eval('$hexdtime = "' . $hexdtime . '";');
- $unc_len = strlen($data);
- $crc = crc32($data);
- $zdata = gzcompress($data);
- $c_len = strlen($zdata);
- $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
- //新添文件内容格式化:
- $datastr = "PK";
- $datastr .= ""; // ver needed to extract
- $datastr .= ""; // gen purpose bit flag
- $datastr .= ""; // compression method
- $datastr .= $hexdtime; // last mod time and date
- $datastr .= pack('v', $crc); // crc32
- $datastr .= pack('v', $c_len); // compressed filesize
- $datastr .= pack('v', $unc_len); // uncompressed filesize
- $datastr .= pack('v', strlen($name)); // length of filename
- $datastr .= pack('v', 0); // extra field length
- $datastr .= $name;
- $datastr .= $zdata;
- $datastr .= pack('v', $crc); // crc32
- $datastr .= pack('v', $c_len); // compressed filesize
- $datastr .= pack('v', $unc_len); // uncompressed filesize
- fwrite($this->fp,$datastr); //写入新的文件内容
- $my_datastr_len = strlen($datastr);
- unset($datastr);
- //新添文件目录信息
- $dirstr = "PK";
- $dirstr .= ""; // version made by
- $dirstr .= ""; // version needed to extract
- $dirstr .= ""; // gen purpose bit flag
- $dirstr .= ""; // compression method
- $dirstr .= $hexdtime; // last mod time & date
- $dirstr .= pack('v', $crc); // crc32
- $dirstr .= pack('v', $c_len); // compressed filesize
- $dirstr .= pack('v', $unc_len); // uncompressed filesize
- $dirstr .= pack('v', strlen($name) ); // length of filename
- $dirstr .= pack('v', 0 ); // extra field length
- $dirstr .= pack('v', 0 ); // file comment length
- $dirstr .= pack('v', 0 ); // disk number start
- $dirstr .= pack('v', 0 ); // internal file attributes
- $dirstr .= pack('v', 32 ); // external file attributes - 'archive' bit set
- $dirstr .= pack('v',$this->datastr_len ); // relative offset of local header
- $dirstr .= $name;
- $this->dirstr .= $dirstr; //目录信息
- $this -> file_count ++;
- $this -> dirstr_len += strlen($dirstr);
- $this -> datastr_len += $my_datastr_len;
- }
- function adddir($name){
- $name = str_replace("\", "/", $name);
- $datastr = "PK ";
- $datastr .= pack("v",0).pack("v",0).pack("v",0).pack("v", strlen($name) );
- $datastr .= pack("v", 0 ).$name.pack("v", 0).pack("v", 0).pack("v", 0);
- fwrite($this->fp,$datastr); //写入新的文件内容
- $my_datastr_len = strlen($datastr);
- unset($datastr);
- $dirstr = "PK ";
- $dirstr .= pack("v",0).pack("v",0).pack("v",0).pack("v", strlen($name) );
- $dirstr .= pack("v", 0 ).pack("v", 0 ).pack("v", 0 ).pack("v", 0 );
- $dirstr .= pack("v", 16 ).pack("v",$this->datastr_len).$name;
- $this->dirstr .= $dirstr; //目录信息
- $this -> file_count ++;
- $this -> dirstr_len += strlen($dirstr);
- $this -> datastr_len += $my_datastr_len;
- }//开源代码phpfensi.com
- function createfile(){
- //压缩包结束信息,包括文件总数,目录信息读取指针位置等信息
- $endstr = "PK" .
- pack('v', $this -> file_count) .
- pack('v', $this -> file_count) .
- pack('v', $this -> dirstr_len) .
- pack('v', $this -> datastr_len) .
- "";
- fwrite($this->fp,$this->dirstr.$endstr);
- fclose($this->fp);
- }
- }
出处:http://www.phpfensi.com/php/20140909/5090.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式