php ZIP压缩类实例分享

php ZIP压缩类实例分享

?





1

2

3

4

5

6

<?php

$zipfiles =array("/root/pooy/test1.txt","/root/pooy/test2.txt");

$z = new
PHPZip();

//$randomstr = random(8);

$zipfile = TEMP."/photocome_".$groupid.".zip";

$z->Zip($zipfiles, $zipfile); //添加文件列表

  PHP的ZIP压缩类:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

<p><?php

#

# PHPZip v1.2
by Sext (sext@neud.net) 2002-11-18

# (Changed: 2003-03-01)

#

# Makes zip archive

#

# Based on "Zip file creation class", uses zLib

#

#

class
PHPZip

{

function Zip($dir, $zipfilename)

{

if (@function_exists(‘gzcompress‘))

{

$curdir = getcwd();

if (is_array($dir))

{

$filelist = $dir;

}

else

{

$filelist = $this
-> GetFileList($dir);

}</p>

<p> if
((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir);

else chdir($curdir);</p>

<p> if
(count($filelist)>0)

{

foreach($filelist as $filename)

{

if (is_file($filename))

{

$fd = fopen ($filename, "r");

$content = fread ($fd, filesize ($filename));

fclose ($fd);</p>

<p> if
(is_array($dir)) $filename = basename($filename);

$this
-> addFile($content, $filename);

}

}

$out = $this
-> file();</p>

<p> chdir($curdir);

$fp = fopen($zipfilename, "w");

fwrite($fp, $out, strlen($out));

fclose($fp);

}

return
1;

}

else return 0;

}</p>

<p> function GetFileList($dir)

{

if (file_exists($dir))

{

$args = func_get_args();

$pref = $args[1];</p>

<p> $dh = opendir($dir);

while($files = readdir($dh))

{

if (($files!=".")&&($files!=".."))

{

if (is_dir($dir.$files))

{

$curdir = getcwd();

chdir($dir.$files);

$file = array_merge($file, $this
-> GetFileList("", "$pref$files/"));

chdir($curdir);

}

else $file[]=$pref.$files;

}

}

closedir($dh);

}

return
$file;

}</p>

<p> var $datasec = array();

var $ctrl_dir = array();

var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";

var $old_offset = 0;</p>

<p> /**

* 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);</p>

<p> if
($timearray[‘year‘] < 1980) {

$timearray[‘year‘] = 1980;

$timearray[‘mon‘] = 1;

$timearray[‘mday‘] = 1;

$timearray[‘hours‘] = 0;

$timearray[‘minutes‘] = 0;

$timearray[‘seconds‘] = 0;

} // end if</p>

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

<p> /**

* 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);</p>

<p> $dtime = dechex($this->unix2DosTime($time));

$hexdtime = ‘\x‘
. $dtime[6] . $dtime[7]

<a >Western union point</a> . ‘\x‘
. $dtime[4] . $dtime[5]

. ‘\x‘
. $dtime[2] . $dtime[3]

. ‘\x‘
. $dtime[0] . $dtime[1];

eval(‘$hexdtime = "‘
. $hexdtime . ‘";‘);</p>

<p> $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</p>

<p> // "local file header" segment

$unc_len = strlen($data);

$crc = crc32($data);

$zdata = gzcompress($data);

$c_len = strlen($zdata);

$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug

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

<p> // "file data" segment

$fr .= $zdata;</p>

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

<p> // add this entry to array

$this
-> datasec[] = $fr;

$new_offset = strlen(implode(‘‘, $this->datasec));</p>

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

<p> $cdrec .= pack(‘V‘, $this
-> old_offset ); // relative offset of local header

$this
-> old_offset = $new_offset;</p>

<p> $cdrec .= $name;</p>

<p> // optional extra field, file comment goes here

// save to central directory

$this
-> ctrl_dir[] = $cdrec;

} // end of the ‘addFile()‘ method</p>

<p> /**

* Dumps out file

*

* @return string the zipped file

*

* @access public

*/

function file()

{

$data = implode(‘‘, $this
-> datasec);

$ctrldir = implode(‘‘, $this
-> ctrl_dir);</p>

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

<p>} // end of the ‘PHPZip‘ class

?></p>

  文章来自:http://bbs.it-home.org/forum-php-1.html

php ZIP压缩类实例分享,布布扣,bubuko.com

时间: 2024-10-13 05:28:32

php ZIP压缩类实例分享的相关文章

一个zip压缩类,欢迎吐槽

package com.utils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; im

C#zip压缩类

改造了网上的代码,可以压缩文件夹.指定文件列表(文件和文件夹的混合列表,需要指定子文件夹下需要压缩的文件),注释很详细不做解释 public class ZipHelper { /// <summary> /// 压缩单个文件 /// </summary> /// <param name="fileToZip">要压缩的文件</param> /// <param name="zipedFile">压缩后的文

dedecms中提取的zip压缩文件操作类zip.class.php

从织梦DeDeCMS中提取的zip压缩文件操作类,包含zip文件压缩.解压缩.添加文件到压缩包中等多个实用的函数,注释详细方便使用. 下载:dedecms中提取的zip压缩文件操作类zip.class.php 包含的函数和简单的使用方法: 1.函数get_List($zip_name) ,函数作用:获取zip文件中的文件列表.函数参数 $zip_name  zip文件名.返回值 文件列表数组. 2.函数Add($files,$compact),函数作用:增加文件到压缩文件.函数参数 $files

C#实现的文件压缩和解压缩类

本文实例讲述了C#实现的文件压缩和解压缩类.分享给大家供大家参考.具体分析如下: 这个C#代码包含了几个类,封装了文件压缩和解压缩常用的方法,包括直接通过代码进行压缩,也有调用winrar对文件进行压缩的 using System; using System.IO; using System.Diagnostics; using Microsoft.Win32; using ICSharpCode.SharpZipLib.Checksums; using ICSharpCode.SharpZip

C#实现Zip压缩解压实例【转】

本文只列举一个压缩帮助类,使用的是有要添加一个dll引用ICSharpCode.SharpZipLib.dll[下载地址]. 另外说明一下的是,这个类压缩格式是ZIP的,所以文件的后缀写成 .zip. 还有,如果用这个类来解压rar格式的压缩文件时会报错,就网上说的那个"Wrong Local header signature: 0x21726152"异常.只要解压ZIP压缩格式的压缩文件就不会报错了. 下面就是Helper类的代码: using System; using Syste

AntZipUtils【基于Ant的Zip压缩解压缩工具类】

版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 Android 压缩解压zip文件一般分为两种方式: 基于JDK的Zip压缩工具类 该版本存在问题:压缩时如果目录或文件名含有中文,压缩后会变成乱码: 使用Java的zip包可以进行简单的文件压缩和解压缩处理时,但是遇到包含中文汉字目录或者包含多层子目录的复杂目录结构时,容易出现各种各样的问题. 基于Ant的Zip压缩工具类 需要第三方JAR包:Apache的ant.jar: 解决了上面存在的问题. 效果图 代码分析 常用的方法: 压缩

文件操作工具类: 文件/目录的创建、删除、移动、复制、zip压缩与解压.

FileOperationUtils.java package com.xnl.utils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.Fi

PHP压缩与解压Zip(PHPZip类)

<?php     class PHPZip     {         private $ctrl_dir     = array();         private $datasec      = array();         /**********************************************************          * 压缩部分          **********************************************

C#实现多级子目录Zip压缩解压实例

? ? 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩,类似winrar,可以选择是否排除基准目录 ? ? ? ? ? ? ? ? ? ? 测试代码 ? ? public?void?ZipDirectoryTest()??? {??? string?path?=?System.IO.Path.Combine(System.IO.Path.GetTempPath(),?DateTime