ホームページ  >  記事  >  バックエンド開発  >  完璧な PHP ZIP 圧縮コード_PHP チュートリアル

完璧な PHP ZIP 圧縮コード_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-20 11:11:501381ブラウズ

このプログラムは、PHP 圧縮クラスを使用してファイルを目的の zip または rar 圧縮パッケージに迅速に圧縮できます。圧縮アルゴリズムは海外の Web サイトからコピーされたものです。

最初にインスタンスを作成し、次にパラメーターを渡します。 2 つのパラメータ。最初のものはファイルアドレスの配列です。 2 番目は、保存する圧縮パッケージ ファイルの絶対アドレスです。 P例:

コードは次のとおりです コードをコピー $ z = New phpzip (); // $ randomstr = ランダム (8); $ zipfile = temp. "/Photocome _" );
$ zipfiles = Array ("/root/pooy/test1.txt", "/root/pooy/test2.txt");


//ファイルリストを追加 PHP の ZIP 圧縮クラスは次のとおりです:

コードは次のとおりです コードをコピー

#
# PHPZip v1.2 by Sext (sext@neud .net) 2002 -11-18
# (変更: 2003-03-01)
#
# zipアーカイブを作成します
#
# 「Zipファイル作成クラス」をベースに、zLib
#
#

class PHPZipを使用します
{function zip($ dir、$ zipfilename)
&(!is_array($ dir)&&(file_exists($ dir))chdir($ dir); ); out = $this -> file();

chdir($curdir);
fwrite ($ FP, $ OUT, Strlen ($ OUT)); fclose ($ fp);
}
1 を返す
}
それ以外の場合は 0 を返す

function getFileList($ dir)
{
if(file_exists($ dir))
{
$ args = func_get_args(); while($files = readdir($dh))
{

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

{
if (is_d ir($dir.$files) )
{
$curdir = getcwd();
chdir($dir.$files);
$file = array_merge($file, $this -> GetFileList("", "$pref$files/"));
chdir($curdir);
}
else $file[]=$pref.$files;
}
}
closeir($dh);
}
return $file;
}

var $datasec = array( );
var $ctrl_dir = array();
var $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";

var $old_offset = 0;


/**
* Unix タイムスタンプを 4 バイトの DOS 日付と時刻形式に変換します (日付
* 上位 2 バイト、時刻は下位 2 バイトで大小比較が可能)。

*

* @param integer 現在の Unix タイムスタンプ
*
* @現在の日付を整数で 4 バイトの DOS 形式で返します
*
* @access private
    */
関数ix2DosTime($unixtime = 0) {
$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);

if ($timearray['year'] < 1980) {
= 1980;
$timearray['mon'] = 1;

$ timearray['mday'] = 1;

$timearray['hours'] = 0;
$timearray[' minutes'] = 0;
$timearray['秒'] = 0;
} // end if

return (($timearray['年'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] <16) |
($timearray['hours'] <11) | ($timearray['分'] << 5) | ($timearray['秒'] >> 1);
} // 'unix2DosTime()' メソッドの終了

/**
* アーカイブに「ファイル」を追加します
*
* @param string ファイルの内容
* @param string アーカイブ内のファイルの名前(パスが含まれる場合があります)
* @param integer 現在のタイムスタンプ
*
* @access public
    */
function 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 = "x50x4bx03x04";
$fr .= "x14x00";            // 抽出するにはverが必要です
$fr .= "x00x00";            // 生成目的ビットフラグ
$fr .= "x08x00";            // 圧縮方法
$fr .= $hexdtime;             //最後のmod時間と日付

// "ローカルファイルヘッダー"segment
$ unc_len = strlen($ data);
$ crc = crc32($ data); = 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 -> datasec[] = $fr;

$new_offset = strlen(implode('', $this->datasec));

// 中央ディレクトリレコードに追加します
$cdrec = "x50x4bx01x02";
$cdrec .= "x00x00";                // 作成者:
$cdrec .= "x14x00";                // 抽出に必要なバージョン
$cdrec .= "x00x00";                // 生成目的ビットフラグ
$cdrec .= "x08x00";                // 圧縮方法
$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 );             // ディスク番号 start
$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;
} // 'addFile()' メソッドの終わり

/**
* ファイルをダンプします
*
* @return string zip ファイル
*
* @access public
    */
関数 file()
{
$data = implode('', $this -> ; datasec);
$ctrldir = implode('', $this -> ctrl_dir);

return
$data .
$ctrldir .
$this -> eof_ctrl_dir .
Pack('v', sizeof($this -> ctrl_dir)) 。  // 「このディスク上」のエントリの合計数
Pack('v', sizeof($this -> ctrl_dir)) 。  // 全体のエントリの合計数
Pack('V', strlen($ctrldir)) 。           // 中央の dir
Pack('V', strlen($data)) のサイズ。              // 中央ディレクトリの先頭へのオフセット
"x00x00";                             // .zip ファイルのコメントの長さ
} // 'file()' メソッドの終わり

} // 'PHPZip' クラスの終わり
?>


www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/444617.html技術記事本プログラム可以快速实现把我们的文件利用php压缩类压缩成我们想的zip,或はrar的压缩包,后缀名可自定哦,压缩算法是来自国外一网站...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。