做了一个需求就是列出zip和rar的内容并入库,朋友是dedecms的系统,需要的是ajax前台显示的,匆忙之间就写了这么一个类!里边有着详细的说明,好了现在代码放出来值得一提的是需要安装个组件http://pecl.php.net/package/rar这里下载,然后也有说明文档好了不多说了,上代码了!
<?php
/*
* Author: widuu
*
* Email:admin@widuu.com
*
* 时间:2013-08
*
* 说明:列出压缩包中的内容(需要安装RarArchive下载地址http://pecl.php.net/package/rar)
*
*/
define(PATH,"D:/wwwroot/thinksns/");
require 'mfdb.class.php';
$mfdb = new mfdb();
$mfdb->connect("localhost","root","dgj99349","test");
class zip
{
/**
* 获取zip文件中的文件列表
*
* @access public
* @param string $zip_name zip文件名
* @param string $id zip对应的id
* @status is ok 插入成功 insert false 插入失败
*/
function get_zip_List($zip_name,$id)
{
$ret = '';
$zip = @fopen(PATH.$zip_name, 'rb');
if(!$zip)
{
return(0);
}
$centd = $this->ReadCentralDir($zip,PATH.$zip_name);
@rewind($zip);
@fseek($zip, $centd['offset']);
for ($i=0; $i<$centd['entries']; $i++)
{
$header = $this->ReadCentralFileHeaders($zip);
$header['index'] = $i;$info['filename'] = $header['filename'];
$info['status'] = $header['status'];
$ret[]=$info;
unset($header);
}
$file = array();
foreach ($ret as $key => $value) {
if($value['status'] == "ok"){
$file_rel = pathinfo($value['filename']);
if(is_file($file_rel['basename']))
{
$file[] = $file_rel['basename'];
}
}else{
$this->exit("zip error");
}
}
$file = $this->array2string($file);
global $mfdb;
$result = $mfdb->query("insert into _mf_zip (`fid`,`filepath`) value ('{$id}','{$file}')");
if($result)
{
echo "is ok";
}else{
echo "insert false";
}
}
/**
* 获取rar文件中的文件列表
*
* @access public
* @param string $zipname zip文件名
* @param string $id zip对应的id
* @status is ok 插入成功 insert false 插入失败
*/
function get_rar_list($zipname,$id){
$rar_file = rar_open (PATH.$zipname) or die( "Can't open Rar archive" );
$entries = rar_list ( $rar_file );
$file = array();
foreach ( $entries as $entry ) {
$file_rel = pathinfo($entry -> getName ());
if(is_file($file_rel['basename'])){
$file[] = $file_rel['basename'];
}
$entry -> extract ( '/dir/extract/to/' );
}
rar_close ( $rar_file );
$file = $this -> array2string($file);
global $mfdb;
$result = $mfdb -> query("insert into _mf_zip (`fid`,`filepath`) value ('{$id}','{$file}')");
if($result)
{
echo "is ok";
}else{
echo "insert false";
}
}
function ReadCentralDir($zip,$zip_name)
{
$size = filesize($zip_name);
if ($size < 277)
{
$maximum_size = $size;
}
else
{
$maximum_size=277;
}
@fseek($zip, $size-$maximum_size);
$pos = ftell($zip); $bytes = 0x00000000;
while ($pos < $size)
{
$byte = @fread($zip, 1); $bytes=($bytes << 8) | Ord($byte);
if ($bytes == 0x504b0506)
{
$pos++; break;
}
$pos++;
}
$data = @unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size',fread($zip, 18));
if ($data['comment_size'] != 0)
{
$centd['comment'] = fread($zip, $data['comment_size']);
}
else
{
$centd['comment'] = ''; $centd['entries'] = $data['entries'];
}
$centd['disk_entries'] = $data['disk_entries'];
$centd['offset'] = $data['offset'];$centd['disk_start'] = $data['disk_start'];
$centd['size'] = $data['size']; $centd['disk'] = $data['disk'];
return $centd;
}
function ReadCentralFileHeaders($zip)
{
$binary_data = fread($zip, 46);
$header = unpack('vchkid/vid/vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $binary_data);
if ($header['filename_len'] != 0)
{
$header['filename'] = fread($zip,$header['filename_len']);
}
else
{
$header['filename'] = '';
}
if ($header['extra_len'] != 0)
{
$header['extra'] = fread($zip, $header['extra_len']);
}
else
{
$header['extra'] = '';
}
if ($header['comment_len'] != 0)
{
$header['comment'] = fread($zip, $header['comment_len']);
}
else
{
$header['comment'] = '';
}
if ($header['mdate'] && $header['mtime'])
{
$hour = ($header['mtime'] & 0xF800) >> 11;
$minute = ($header['mtime'] & 0x07E0) >> 5;
$seconde = ($header['mtime'] & 0x001F)*2;
$year = (($header['mdate'] & 0xFE00) >> 9) + 1980;
$month = ($header['mdate'] & 0x01E0) >> 5;
$day = $header['mdate'] & 0x001F;
$header['mtime'] = mktime($hour, $minute, $seconde, $month, $day, $year);
}
else
{
$header['mtime'] = time();
}
$header['stored_filename'] = $header['filename'];
$header['status'] = 'ok';
if (substr($header['filename'], -1) == '/')
{
$header['external'] = 0x41FF0010;
}
return $header;
}
/**
* 判断并插入压缩包内数据
*
* @param $zipname 字符串 压缩包文件名称
* @param $id 字符串 填写的压缩包对应的id
* @return 返回状态 id exists 数据库已存在 is not zip or rar 不是zip活着rar文件
*/
function judge($zipname,$id){
global $mfdb;
$data = $mfdb->get_one("select * from _mf_zip where fid = $id");
if ($data !=Null)
{
exit("id exists");
}
$suffix = substr($zipname,-4);
if($suffix ==".rar")
{
$this->get_rar_List($zipname,$id);
}else if($suffix == ".zip"){
$this->get_zip_List($zipname,$id);
}else{
exit('is not zip or rar');
}
}
/**
* 将数组转换为字符串
*
* @param array $data 数组
* @param bool $isformdata 如果为0,则不使用new_stripslashes处理,可选参数,默认为1
* @return string 返回字符串,如果,data为空,则返回空
*/
function array2string($data, $isformdata = 1) {
if($data == '') return '';
if($isformdata) $data = $this->new_stripslashes($data);
return addslashes(var_export($data, TRUE));
}
/**
* 返回经stripslashes处理过的字符串或数组
* @param $string 需要处理的字符串或数组
* @return mixed
*/
function new_stripslashes($string) {
if(!is_array($string)) return stripslashes($string);
foreach($string as $key => $val) $string[$key] =$this-> new_stripslashes($val);
return $string;
}
}
//举例 附赠插入数据库
/*
*DROP TABLE IF EXISTS `_mf_zip`;
*CREATE TABLE `_mf_zip` (
*`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
*`fid` int(10) unsigned NOT NULL,
*`filepath` text NOT NULL,
*PRIMARY KEY (`id`)
*) ENGINE=InnoDB DEFAULT CHARSET=utf8;
*/
$zip = new zip();
$zipname = $zip->judge("php.rar",4);
OK 大家有什么需求或者使用的可以联系我,我的邮箱admin#widuu.com(#换成@)或者qq联系23169450

发表评论 取消回复