PHP ファイルのオンライン圧縮コード_PHP チュートリアル

WBOY
リリース: 2016-07-20 11:07:49
オリジナル
1016 人が閲覧しました

php 文件在在压缩代码


class PHPZip
{
function Zip($dir, $zipfilename)
{
if (@function_exists('gzcompress'))
{
$curdir();
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 = [ 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,

$これは - > 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;

/**
* Unix タイムスタンプを 4 バイトの DOS 日付と時刻形式に変換します

(日付
* 上位 2 バイト、下位 2 バイトの時間で大きさ

の比較が可能)。
*
* @param integer 現在の Unix タイムスタンプ
*
* @return integer 4 バイト DOS 形式の現在の日付
*
* @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['秒'] = 0;
} // end if

return (($timearray['年'] - 1980) << 25) | ($timearray['mon'] <<

21) | ($timearray['mday'] <16) |
($timearray['hours'] <11) | ($timearray[' minutes'] << 5) |

($timearray['秒'] >> 1);
} // 'unix2DosTime()' メソッドの終了


/* *
*「ファイル」をアーカイブに追加します *
* @param文字列ファイルコンテンツ * @param文字列アーカイブ内のファイルの名前(

pathが含まれる場合があります) * @param integer現在のタイムスタンプ *

* @公開アクセス

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

// 「データ記述子」セグメント (オプションですが、アーカイブが
の場合は必要です)

not
// ファイルとして機能します)
$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";
$cdre c .= "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' ビット set

$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 ファイル コメント

length
} // 'file()' メソッドの終わり


}


www.bkjia.com 本当 http://www.bkjia.com/PHPjc/444935.html 技術記事 php 文件在播压缩代码 class PHPZip { function Zip($dir, $zipfilename) { if (@function_exists('gzcompress')) { $curdir = getcwd(); if (is_array($dir)) { $filelist = $dir; } え...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!