PHPZip的使用

2023-03-20 0 970
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
class PHPZip
{
function Zip($dir, $zipfilename)
{
       if (@function_exists('gzcompress'))
       {
         $curdir = getcwd();
         if (is_array($dir))
         {
                   $filelist = $dir;
         }
         else
         {
            $filelist = $this -> GetFileList($dir);
         }
         
         if ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir);
         else chdir($curdir);
 
         if (count($filelist)>0)
         {
            foreach($filelist as $filename)
            {
                   if (is_file($filename))
                   {
                     $fd = fopen ($filename, "r");
                     $content = fread ($fd, filesize ($filename));
                     fclose ($fd);
 
                     if (is_array($dir)) $filename = basename($filename);
                     $this -> addFile($content, $filename);
                   }
            }
            $out = $this -> file();
 
            chdir($curdir);
            $fp = fopen($zipfilename, "w");
            fwrite($fp, $out, strlen($out));
            fclose($fp);
         }
         return 1;
       }
       else return 0;
}
 
function GetFileList($dir)
{
       if (file_exists($dir))
       {
         $args = func_get_args();
         $pref = $args[1];
   
         $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;
}
 
var $datasec    = array();
var $ctrl_dir     = array();
var $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";
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 = "x50x4bx03x04";
       $fr .= "x14x00";          // ver needed to extract
       $fr .= "x00x00";          // gen purpose bit flag
       $fr .= "x08x00";          // compression method
       $fr .= $hexdtime;          // last mod time and date
 
       // "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;
 
       // "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;
       $new_offset        = strlen(implode('', $this->datasec));
 
       // now add to central directory record
       $cdrec = "x50x4bx01x02";
       $cdrec .= "x00x00";             // version made by
       $cdrec .= "x14x00";             // version needed to extract
       $cdrec .= "x00x00";             // gen purpose bit flag
       $cdrec .= "x08x00";             // 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 = $new_offset;
 
       $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
         "x00x00";                             // .zip file comment length
} // end of the 'file()' method
 
 
} // end of the 'PHPZip' class
?>
 
<?php
//使用方法
 
$z = new PHPZip(); //新建立一个zip的类
 
方法一:
$z -> Zip("", "out1.zip"); //添加当前目录和子目录下的所有档案
 
 
方法二:
$files=array('1.txt','gb.txt');
$files[]='5.txt';
$z -> Zip($files, "out2.zip"); //添加文件列表
 
 
方法三:
$z -> Zip("/usr/local/sext/", "out3.zip"); //添加指定目录
?>

1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!

2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理,有奖励!

3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!

4. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有猫币奖励和额外收入!

5. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!

ER0学院 php 代码片段 PHPZip的使用 https://www.er0xy.com/2692.html

PHPZip的使用
上一篇: 使用PHPExcel库
PHPZip的使用
下一篇: YII2中的get和post
常见问题

相关文章

发表评论
1 条评论
2023年 5月 4日 下午6:50 回复

Can you be more specific about the content of your article? After reading it, I still have some doubts. Hope you can help me.

  • 0 +

    访问总数

  • 0 +

    会员总数

  • 0 +

    文章总数

  • 0 +

    今日发布

  • 0 +

    本周发布

  • 0 +

    运行天数

你的前景,远超我们想象