- /*
- ファイル名: /include/zip.php
- 著者: Horace 2009/04/15
- */
- class PHPZip{
- var $dirInfo = array("0","0 ");
- var $rootDir = '';
- var $datasec = array();
- var $ctrl_dir = array();
- var $eof_ctrl_dir = "/x50/x4b/x05/x06/x00/x00/x00/x00";
- var $old_offset = 0;
- function downloadZip(){
- createZip($dir, $zipfilename, true);
- }
- function createZip($dir, $zipfilename, $autoDownload = false){
- if (@function_exists('gzcompress')){
- @set_time_limit("0");
- if (is_array($dir)){
- $fd = fopen ($dir, "r");
-
- $fileValue = fread ($fd, ファイルサイズ ($filename));
- fclose ($fd);
- if (is_array($dir)) $filename = Basename($dir);
- $this -> addFile($fileValue, "$ファイル名");
- }else{
- $this->dirTree($dir,$dir);
- }
- $zipfilenametemp = time().$zipfilename;
- $out = $this ->ファイルzip();
- $fp = fopen($zipfilenametemp, "w");
- fwrite($fp, $out, strlen($out));
- fclose($fp);
- $filesize = ファイルサイズ($zipfilenametemp);
- if ($filesize < 104857600) {
- if($autoDownload){
- header("Content-type: application/octet-stream");
- header("Content-disposition:attachment; filename=".$zipfilename);
- }
- echo $this ->ファイルzip();
- }else{
- echo "zip エラーの作成!";
- }
- unlink($zipfilenametemp);
- }
- }
- //ディレクトリツリーを取得..
- function dirTree($directory,$rootDir){
- global $_SERVER,$dirInfo,$rootDir;
- $fileDir=$rootDir;
- $myDir=dir($ディレクトリ);
- while($file=$myDir->read()){
-
-
- if(is_dir("$directory/$file") and $file!="." and $file!=".."){
- $dirInfo[0]++;
- $rootDir ="$fileDir$file/";
- $this -> addFile('', "$rootDir");
- //n のフォルダーに移動します
- $this->dirTree("$directory/$file",$rootDir);
- }else{
- if($file!="." and $file!=".."){
- $dirInfo[1]++;
- //$fd = fopen ("$ディレクトリ/$ファイル", "r");
- $fileValue = file_get_contents("$ディレクトリ/$ファイル");
- //fclose ($fd);
- $this -> addFile($fileValue, "$fileDir$file");
- }
- }
- }
- $myDir->close();
- }
- 関数 unix2DosTime($unixtime = 0) {
- $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
- if ($timearray['year'] < 1980) {
- $timearray['year'] = 1980;
- $timearray['mon'] = 1;
- $timearray['mday'] = 1;
- $timearray['時間'] = 0;
- $timearray['分'] = 0;
- $timearray['秒'] = 0;
-
-
- } // end if
- return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
- ($timearray['hours'] << 11) | ($timearray['分'] << 5) | ($timearray['秒'] >> 1);
- }
- 関数 addFile($data, $name, $time = 0){
- $name = str_replace('//', '/', $name);
- $dtime = dechex($this->unix2DosTime($time));
- $hexdtime = '/x' 。 $dtime[6] 。 $dtime[7]
- . '/バツ' 。 $dtime[4] 。 $dtime[5]
- . '/バツ' 。 $dtime[2] 。 $dtime[3]
- . '/バツ' 。 $dtime[0] 。 $dtime[1];
- eval('$hexdtime = "' . $hexdtime . '";');
- $fr = "/x50/x4b/x03/x04";
- $fr .= "/x14/x00"; //
- を抽出するために必要なバージョン $fr .= "/x00/x00"; // 生成目的ビットフラグ
- $fr .= "/x08/x00"; // 圧縮方法
- $fr .= $hexdtime; // 最終更新日時
- // 「ローカル ファイル ヘッダー」セグメント
- $unc_len = strlen($data);
- $crc = crc32($data);
- $zdata = gzcompress($data);
-
-
- $c_len = strlen($zdata);
- $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // crc バグを修正
- $fr .= Pack('V', $crc); // crc32
- $fr .= Pack('V', $c_len); // 圧縮ファイルサイズ
- $fr .= Pack('V', $unc_len); // 非圧縮ファイルサイズ
- $fr .= Pack('v', strlen($name)); // ファイル名の長さ
- $fr .= Pack('v', 0); // 追加のフィールド長
- $fr .= $name;
- // 「ファイルデータ」セグメント
- $fr .= $zdata;
- // 「データ記述子」セグメント (オプションですが、アーカイブがファイルとして提供されない場合は必須です)
- // ファイルとして機能します
- $fr .= Pack('V', $crc); // crc32
- $fr .= Pack('V', $c_len); // 圧縮ファイルサイズ
- $fr .= Pack('V', $unc_len); // 非圧縮ファイルサイズ
- // このエントリを配列に追加します
- $this ->データセック[] = $fr;
- $new_offset = strlen(implode('', $this->datasec));
- // 中央ディレクトリレコードに追加します
- $cdrec = "/x50/x4b/x01/x02";
- $cdrec .= "/x00/x00"; //
- によって作成されたバージョン $cdrec .= "/x14/x00"; //
-
-
- を抽出するために必要なバージョン $cdrec .= "/x00/x00"; // 生成目的ビットフラグ
- $cdrec .= "/x08/x00"; // 圧縮方式
- $cdrec .= $hexdtime; // 最終更新日時
- $cdrec .= Pack('V', $crc); // crc32
- $cdrec .= Pack('V', $c_len); // 圧縮ファイルサイズ
- $cdrec .= Pack('V', $unc_len); // 非圧縮ファイルサイズ
- $cdrec .= Pack('v', strlen($name) ); // ファイル名の長さ
- $cdrec .= Pack('v', 0 ); // 追加のフィールド長
- $cdrec .= Pack('v', 0 ); // ファイルコメントの長さ
- $cdrec .= Pack('v', 0 ); // ディスク番号の開始
- $cdrec .= Pack('v', 0 ); // 内部ファイル属性
- $cdrec .= Pack('V', 32 ); // 外部ファイル属性 - 'archive' ビット セット
- $cdrec .= Pack('V', $this -> old_offset ); // ローカルヘッダーの相対オフセット
- $this -> old_offset = $new_offset;
- $cdrec .= $name;
- // オプションの追加フィールド、ファイルのコメントがここに入ります
- // 中央ディレクトリに保存します
- $this -> ctrl_dir[] = $cdrec;
- }
- function filezip(){
- $data = implode('', $this -> datasec);
- $ctrldir = implode('', $this -> ctrl_dir);
- $data を返します。
- $ctrldir 。
- $this -> eof_ctrl_dir 。
- Pack('v', sizeof($this -> ctrl_dir)) 。 // 「このディスク上」のエントリの合計数
- Pack('v', sizeof($this -> ctrl_dir)) 。 // 全体のエントリの合計数
- Pack('V', strlen($ctrldir)) 。 // 中央ディレクトリのサイズ
- Pack('V', strlen($data)) 。 // 中央ディレクトリの先頭へのオフセット
- "/x00/x00"; // .zip ファイルのコメントの長さ
- }
- }
- ?>
-
-
-
- 他に一つの比较简单があります
-
- [php] view plaincopy
-
-
- class createzip
- {
- /* @圧縮されたzipファイルを作成します 将多文件压缩成一个zip文ファイルの関数
- * @$files 数组型 实例array("1.jpg","2.jpg");
- * @destination 目标文件の路径 例:"c:/androidyue.zip"
- * @$overwrite かどうかは上盖と目标文件と同じ文件
- * @Androidyue によって記録
- * @Blog:http://thinkblog.sinaapp. com
- */
- function create_zip($files = array(),$destination = '',$overwrite = false)
- {
- //如果zip文件已经存在并および设置は不重写返false
- if(file_exists($ destination) && !$overwrite) { return false; }
- $valid_files = array();
- //ファイルが渡された場合...
- //実際の有効なファイル名を取得します
- if(is_array($files)) {
- //各ファイルを循環します
- foreach($ files as $file) {
- //ファイルが存在することを確認します
- if(file_exists($file)) {
- $valid_files[] = $file; }
- }
- }
- //実際の有効なファイルが存在する場合
- if (count($valid_files))
- {
- // アーカイブを作成します
- $zip = new ZipArchive()
- // ファイルが既に存在する場合は上書きし、存在しない場合は作成します
- if($zip- >open( $destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
- return false; }
- //圧縮ファイルにファイルを追加
- foreach($valid_files as $file) {
- $zip ->addFile($file,$file);
- }
- //ファイルを閉じる
- $zip->close();
- //ファイルが存在するかどうかを確認する
- return file_exists($destination);
- }
- else{
- //実際の有効なファイルがない場合は、 false を返します
- }
- }
-
- }
- /****
- //テスト関数
- $files=array('temp.php','test.php');
- create_zip($files, 'myzipfile.zip', true);*/
- ?> コードをコピーします
-
-
-
-
圧縮ファイル、php
|