ホームページ php教程 php手册 ZIPを解凍するためのPHP用クラス

ZIPを解凍するためのPHP用クラス

Jun 21, 2016 am 08:52 AM
header quot size

 

  //以下は类及関数数定义

  class Zip //ZIP压缩类

  {

  var $datasec, $ctrl_dir = array();

  var $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";

  var $old_offset = 0; var $dirs = Array(".");

  関数 get_List($zip_name)

  {

  $zip = @fopen($zip_name, 'rb');

  if(!$zip) return(0);

  $centd = $this->ReadCentralDir($zip,$zip_name);

  @rewind($zip);

  @fseek($zip, $centd['offset']);

  for ($i=0; $i

  {

  $header = $this->ReadCentralFileHeaders($zip);

  $header['index'] = $i;$info['filename'] = $header['filename'];

  $info['stored_filename'] = $header['stored_filename'];

  $info['size'] = $header['size'];$info['compressed_size']=$header['compressed_size'];

  $info['crc'] = strtoupper(dechex( $header['crc'] ));

  $info['mtime'] = $header['mtime']; $info['コメント'] = $header['コメント'];

  $info['folder'] = ($header['external']==0x41FF0010$header['external']==16)?1:0;

  $info['index'] = $header['index'];$info['status'] = $header['status'];

  $ret[]=$info; unset($header);

  }

  $ret を返す;

  }

  関数 Add($files,$compact)

  {

  if(!is_array($files[0])) $files=Array($files);

  for($i=0;$files[$i];$i++){

  $fn = $files[$i];

  if(!in_Array(dirname($fn[0]),$this->dirs))

  $this->add_Dir(dirname($fn[0]));

  if(ベース名($fn[0]))

  $ret[basename($fn[0])]=$this->add_File($fn[1],$fn[0],$compact);

  }

  $ret を返す;

  }

  関数 get_file()

  {

  $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)) 。 "x00x00";

  }

  関数 add_dir($name)

  {

  $name = str_replace("\", "/", $name);

  $fr = "x50x4bx03x04x0ax00x00x00x00x00x00x00x00x00";

  $fr .= Pack("V",0).pack("V",0).pack("V",0).pack("v", strlen($name) );

  $fr .= Pack("v", 0 ).$name.pack("V", 0).pack("V", 0).pack("V", 0);

  $this -> datasec[] = $fr;

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

  $cdrec = "x50x4bx01x02x00x00x0ax00x00x00x00x00x00x00x00x00";

  $cdrec .= Pack("V",0).pack("V",0).pack("V",0).pack("v", strlen($name) );

  $cdrec .= Pack("v", 0 ).pack("v", 0 ).pack("v", 0 ).pack("v", 0 );

  $ext = "xffxffxffxff";

  $cdrec .= Pack("V", 16 ).pack("V", $this -> old_offset ).$name;

  $this -> ctrl_dir[] = $cdrec;

  $this -> old_offset = $new_offset;

  $this -> dirs[] = $name;

  }

  関数 add_File($data, $name, $compact = 1)

  {

  $name = str_replace('\', '/', $name);

  $dtime = dechex($this->DosTime());

  $hexdtime = 'x' 。 $dtime[6] 。 $dtime[7].'x'.$dtime[4] 。 $dtime[5]

  。 'x' 。 $dtime[2] 。 $dtime[3].'x'.$dtime[0].$dtime[1];

  eval('$hexdtime = "' . $hexdtime . '";');

  if($compact)

  $fr = "x50x4bx03x04x14x00x00x00x08x00".$hexdtime;

  else $fr = "x50x4bx03x04x0ax00x00x00x00x00".$hexdtime;

  $unc_len = strlen($data); $crc = crc32($data);

  if($compact){

  $zdata = gzcompress($data); $c_len = strlen($zdata);

  $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);

  }その他{

  $zdata = $data;

  }

  $c_len=strlen($zdata);

  $fr .= Pack('V', $crc).pack('V', $c_len).pack('V', $unc_len);

  $fr .= Pack('v', strlen($name)).pack('v', 0).$name.$zdata;

  $fr .= Pack('V', $crc).pack('V', $c_len).pack('V', $unc_len);

  $this -> datasec[] = $fr;

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

  if($compact)

  $cdrec = "x50x4bx01x02x00x00x14x00x00x00x08x00";

  else $cdrec = "x50x4bx01x02x14x00x0ax00x00x00x00x00";

  $cdrec .= $hexdtime.pack('V', $crc).pack('V', $c_len).pack('V', $unc_len);

  $cdrec .= Pack('v', strlen($name) ).pack('v', 0 ).pack('v', 0 );

  $cdrec .= Pack('v', 0 ).pack('v', 0 ).pack('V', 32 );

  $cdrec .= Pack('V', $this -> old_offset );

  $this -> old_offset = $new_offset;

  $cdrec .= $name;

  $this -> ctrl_dir[] = $cdrec;

  true を返します;

  }

  function DosTime() {

  $timearray = getdate();

  if ($timearray['year']

  $timearray['年'] = 1980; $timearray['mon'] = 1;

  $timearray['mday'] = 1; $timearray['時間'] = 0;

  $timearray['分'] = 0; $timearray['秒'] = 0;

  }

  return (($timearray['year'] - 1980)

  ($timearray['分'] <<5) ($timearray['秒'] >> 1);

  }

  function Extract ( $zn, $to, $index = Array(-1) )

  {

  $ok = 0; $zip = @fopen($zn,'rb');

  if(!$zip) return(-1);

  $cdir = $this->ReadCentralDir($zip,$zn);

  $pos_entry = $cdir['オフセット'];

  if(!is_array($index)){ $index = array($index); }

  for($i=0; $index[$i];$i++){

  if(intval($index[$i])!=$index[$i]$index[$i]>$cdir['entries'])

  return(-1);

  }

  for ($i=0; $i

  {

  @fseek($zip, $pos_entry);

  $header = $this->ReadCentralFileHeaders($zip);

  $header['インデックス'] = $i; $pos_entry = ftell($zip);

  @rewind($zip); fseek($zip, $header['offset']);

  if(in_array("-1",$index)in_array($i,$index))

  $stat[$header['filename']]=$this->ExtractFile($header, $to, $zip);

  }

  fclose($zip);

  $stat を返す;

  }

  関数 ReadFileHeader($zip)

  {

  $binary_data = fread($zip, 30);

  $data = unpack('vchk/vid/vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $binary_data);

  $header['filename'] = fread($zip, $data['filename_len']);

  if ($data['extra_len'] != 0) {

  $header['extra'] = fread($zip, $data['extra_len']);

  } else { $header['extra'] = ''; }

  $header['compression'] = $data['compression'];$header['size'] = $data['size'];

  $header['compressed_size'] = $data['compressed_size'];

  $header['crc'] = $data['crc']; $header['flag'] = $data['flag'];

  $header['mdate'] = $data['mdate'];$header['mtime'] = $data['mtime'];

  if ($header['mdate'] && $header['mtime']){

  $hour=($header['mtime']&0xF800)>>11;$ minutes=($header['mtime']&0x07E0)>>5;

  $seconde=($header['mtime']&0x001F)*2;$year=(($header['mdate']&0xFE00)>>9)+1980;

  $month=($header['mdate']&0x01E0)>>5;$day=$header['mdate']&0x001F;

  $header['mtime'] = mktime($hour, $分, $秒, $月, $日, $年);

  }else{$header['mtime'] = time();}

  $header['stored_filename'] = $header['filename'];

  $header['ステータス'] = "ok";

  $header を返す;

  }

  関数 ReadCentralFileHeaders($zip){

  $binary_data = fread($zip, 46);

  $header = unpack('vchkid/vid/vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $binary_data);

  if ($header['filename_len'] != 0)

  $header['filename'] = fread($zip,$header['filename_len']);

  else $header['filename'] = '';

  if ($header['extra_len'] != 0)

  $header['extra'] = fread($zip, $header['extra_len']);

  else $header['extra'] = '';

  if ($header['comment_len'] != 0)

  $header['comment'] = fread($zip, $header['comment_len']);

  else $header['comment'] = '';

  if ($header['mdate'] && $header['mtime'])

  {

  $hour = ($header['mtime'] & 0xF800) >> 11;

  $分 = ($header['mtime'] & 0x07E0) >> 5;

  $seconde = ($header['mtime'] & 0x001F)*2;

  $year = (($header['mdate'] & 0xFE00) >> 9) + 1980;

  $month = ($header['mdate'] & 0x01E0) >> 5;

  $day = $header['mdate'] & 0x001F;

  $header['mtime'] = mktime($hour, $分, $秒, $月, $日, $年);

  } else {

  $header['mtime'] = time();

  }

  $header['stored_filename'] = $header['filename'];

  $header['ステータス'] = 'ok';

  if (substr($header['filename'], -1) == '/')

  $header['external'] = 0x41FF0010;

  $header を返す;

  }

  関数 ReadCentralDir($zip,$zip_name)

  {

  $size = ファイルサイズ($zip_name);

  if ($size

  それ以外の場合 $maximum_size=277;

  @fseek($zip, $size-$maximum_size);

  $pos = ftell($zip); $bytes = 0x00000000;

  while ($pos

  {

  $byte = @fread($zip, 1); $bytes=($bytes << 8) Ord($byte);

  if ($bytes == 0x504b0506){ $pos++;壊す; $pos++;

  }

  $data=unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size',fread($zip,18));

  if ($data['comment_size'] != 0)

  $centd['comment'] = fread($zip, $data['comment_size']);

  それ以外の場合 $centd['コメント'] = ''; $centd['entries'] = $data['entries'];

  $centd['disk_entries'] = $data['disk_entries'];

  $centd['offset'] = $data['offset'];$centd['disk_start'] = $data['disk_start'];

  $centd['サイズ'] = $data['サイズ']; $centd['ディスク'] = $data['ディスク'];

  $centd を返す;

  }

  function ExtractFile($header,$to,$zip)

  {

  $header = $this->readfileheader($zip);

  if(substr($to,-1)!="/") $to.="/";

  if(!@is_dir($to)) @mkdir($to,0777);

  $pth =explode("/",dirname($header['filename']));

  for($i=0;isset($pth[$i]);$i++){

  if(!$pth[$i]) continue;$pthss.=$pth[$i]."/";

  if(!is_dir($to.$pthss)) @mkdir($to.$pthss,0777);

  }

  if (!($header['external']==0x41FF0010)&&!($header['external']==16))

  {

  if ($header['compression']==0)

  {

  $fp = @fopen($to.$header['ファイル名'], 'wb');

  if(!$fp) return(-1);

  $size = $header['compressed_size'];

  while ($size != 0)

  {

  $read_size = ($size

  $buffer = fread($zip, $read_size);

  $binary_data = Pack('a'.$read_size, $buffer);

  @fwrite($fp, $binary_data, $read_size);

  $size -= $read_size;

  }

  fclose($fp);

  touch($to.$header['filename'], $header['mtime']);

  }その他{

  $fp = @fopen($to.$header['filename'].'.gz','wb');

  if(!$fp) return(-1);

  $binary_data = Pack('va1a1Va1a1', 0x8b1f, Chr($header['compression']),

  Chr(0x00), time(), Chr(0x00), Chr(3));

  fwrite($fp, $binary_data, 10);

  $size = $header['compressed_size'];

  while ($size != 0)

  {

  $read_size = ($size

  $buffer = fread($zip, $read_size);

  $binary_data = Pack('a'.$read_size, $buffer);

  @fwrite($fp, $binary_data, $read_size);

  $size -= $read_size;

  }

  $binary_data = Pack('VV', $header['crc'], $header['size']);

  fwrite($fp, $binary_data,8); fclose($fp);

  $gzp = @gzopen($to.$header['filename'].'.gz','rb') または die("Cette archive est compress閑");

  if(!$gzp) return(-2);

  $fp = @fopen($to.$header['filename'],'wb');

  if(!$fp) return(-1);

  $size = $header['size'];

  while ($size != 0)

  {

  $read_size = ($size

  $buffer = gzread($gzp, $read_size);

  $binary_data = Pack('a'.$read_size, $buffer);

  @fwrite($fp, $binary_data, $read_size);

  $size -= $read_size;

  }

  fclose($fp); gzclose($gzp);

  touch($to.$header['filename'], $header['mtime']);

  @unlink($to.$header['filename'].'.gz');

  }}

  true を返します;

  }

  } //ZIP压缩类end



このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JavaのFile.length()関数を使用してファイルのサイズを取得します。 JavaのFile.length()関数を使用してファイルのサイズを取得します。 Jul 24, 2023 am 08:36 AM

ファイルのサイズを取得するには、Java の File.length() 関数を使用します。ファイル操作を扱うとき、ファイル サイズは非常に一般的な要件です。Java では、ファイルのサイズを取得するための非常に便利な方法、つまり length( ) File クラスのメソッド。この記事では、このメソッドを使用してファイルのサイズを取得する方法と、対応するコード例を紹介します。まず、サイズを取得したいファイルを表す File オブジェクトを作成する必要があります。 File オブジェクトを作成する方法は次のとおりです: Filef

SpringBoot はどのように Feign 呼び出しを通じてヘッダー内のパラメーターを渡しますか? SpringBoot はどのように Feign 呼び出しを通じてヘッダー内のパラメーターを渡しますか? May 16, 2023 pm 08:38 PM

[SpringBoot] Feign 呼び出しを介してヘッダーのパラメーターを渡す Feign を介してヘッダー パラメーターを渡す方法 問題の説明 Feign を使用して Spring Cloud の別のサービスの API インターフェイスをリクエストする場合、ヘッダーでパラメーターを渡す必要があります。特別な処理が行われると、ヘッダー内のパラメータが失われます。解決策 1: @RequestHeader(name="headerName") を介して渡します。例: Feign は次のように定義されます @FeignClient(name="service-name")pub

Linuxヘッダーとはどういう意味ですか? Linuxヘッダーとはどういう意味ですか? Jul 18, 2023 pm 03:34 PM

Linux ヘッダーは、コンテンツに関するメタデータを含めるために使用されるファイルまたはデータ ストリームの先頭を指します。ヘッダー ファイルを正しく記述して使用することで、開発者はシステム リソースをより有効に活用し、コードの可読性と保守性を向上させることができます。

PHP header() メソッドを使用して Web ページを調整する方法 PHP header() メソッドを使用して Web ページを調整する方法 Mar 28, 2023 pm 01:54 PM

PHP は、動的な Web サイトや Web アプリケーションの作成に使用できる強力なプログラミング言語です。最も強力な機能の 1 つは、PHP の header() メソッドです。この記事では、PHP の header() メソッドを使用して Web ページを調整する方法を説明します。

PHPヘッダーにジャンプする方法 PHPヘッダーにジャンプする方法 Dec 02, 2022 am 09:14 AM

PHP ヘッダーでジャンプを実装する方法: 1. "Header("Location:$url");" 構文を使用してジャンプを実装します。 2. "if($_COOKIE[" u_type のようなジャンプ ステートメントを使用して、if 判定を使用してジャンプを実装します) "]){ header('location:register.php'); } else{ setcookie('u_type','1','86400*360');"。

html5タグのヘッドとヘッダーの違いは何ですか? html5タグのヘッドとヘッダーの違いは何ですか? Jan 17, 2022 am 11:10 AM

相違点: 1. head タグは、すべての head 要素のコンテナであるドキュメントの先頭を定義するために使用され、header タグはドキュメントのヘッダー (紹介情報) を定義するために使用されます; 2. すべてのブラウザは、 head タグと古いバージョンのブラウザ どのブラウザも header タグをサポートしていません。header タグをサポートするには、IE9 以降などのブラウザが必要です。

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

PHP ファイル ダウンロード関数の完全なリスト: readfile、ヘッダー、Content-Disposition およびその他の関数のファイル ダウンロード例の分析 PHP ファイル ダウンロード関数の完全なリスト: readfile、ヘッダー、Content-Disposition およびその他の関数のファイル ダウンロード例の分析 Nov 18, 2023 pm 03:26 PM

PHP ファイル ダウンロード関数の完全なリスト: readfile、ヘッダー、Content-Disposition およびその他の関数のファイル ダウンロードの例分析 ファイルのダウンロードは Web アプリケーションの重要な機能の 1 つであり、広く使用されている Web 開発言語としての PHP は、多くの Aファイルのダウンロードを実装する関数とメソッド。この記事では、readfile、header、Content-Dispo など、PHP で一般的に使用されるファイル ダウンロード関数を紹介します。

See all articles