Here is a simple function which zips folders with all sub folders or only a simple file... the $data var can be a string or an array...
<?php
public function un_zip($data,$arcpf,$mode='zip',$obj=''){
$absoluterpfad = 'YOUR_BASE_PATH';
$arcpf = $absoluterpfad.DS.$arcpf;
if(is_object($obj)==false){
$archiv = new ZipArchive();
$archiv->open($arcpf,ZipArchive::CREATE);
}else{$archiv =& $obj;}
if($mode=='zip'){
if(is_array($data)==true){
foreach($data as $dtmp){
$archiv =& un_zip($dtmp,$arcpf,'zip',&$archiv);
}
}else{
if(is_dir($data)==true){
$archiv->addEmptyDir(str_replace($absoluterpfad.DS,'',$data));
$files = scandir($data);
$bad = array('.','..');
$files = array_diff($files,$bad);
foreach($files as $ftmp){
if(is_dir($data.DS.$ftmp)==true){
$archiv->addEmptyDir(str_replace($absoluterpfad.DS,'',$data.'/'.$ftmp));
$archiv =& un_zip($data.DS.$ftmp,$arcpf,'zip',&$archiv);
}elseif(is_file($data.DS.$ftmp)==true){
$archiv->addFile($data.DS.$ftmp,str_replace($absoluterpfad.DS,'',$data.'/'.$ftmp));
}
}
}elseif(is_file($data)==true){$archiv->addFile($data,str_replace($absoluterpfad.DS,'',$data));}
}
}
if(is_object($obj)==false){$archiv->close();}
else{return $archiv;}
if($mode=='unzip'){$archiv->extractTo($data);}
}
?>
ZipArchive クラス
(バージョン情報なし。おそらく SVN 版にしか存在しないでしょう)
導入
Zip で圧縮されたファイルアーカイブです。
クラス概要
ZipArchive
{
/* プロパティ */
/* メソッド */
bool addFile
( string $filename
[, string $localname = NULL
[, int $start = 0
[, int $length = 0
]]] )
}プロパティ
- status
-
Zip アーカイブの状態
- statusSys
-
Zip アーカイブのシステム状態
- numFiles
-
アーカイブ内のファイル数
- filename
-
ファイルシステム上のファイル名
- comment
-
アーカイブのコメント
目次
- ZipArchive::addEmptyDir — 新しいディレクトリを追加する
- ZipArchive::addFile — 指定したパスからファイルを ZIP アーカイブに追加する
- ZipArchive::addFromString — 内容を指定して、ファイルを ZIP アーカイブに追加する
- ZipArchive::close — アクティブな (オープンされた、あるいは新しく作成された) アーカイブを閉じる
- ZipArchive::deleteIndex — インデックスを使用して、アーカイブ内のエントリを削除する
- ZipArchive::deleteName — 名前を使用して、アーカイブからエントリを削除する
- ZipArchive::extractTo — アーカイブの内容を展開する
- ZipArchive::getArchiveComment — ZIP アーカイブのコメントを返す
- ZipArchive::getCommentIndex — エントリのインデックスを使用して、エントリのコメントを返す
- ZipArchive::getCommentName — エントリ名を使用して、エントリのコメントを返す
- ZipArchive::getFromIndex — インデックスを使用して、エントリの内容を返す
- ZipArchive::getFromName — 名前を使用して、エントリの内容を返す
- ZipArchive::getNameIndex — インデックスを使用して、エントリの名前を返す
- ZipArchive::getStatusString — システムエラー、または ZIP メッセージに関するエラー情報を返す
- ZipArchive::getStream — 名前を使用して、エントリのファイルハンドラ (読み込み専用) を取得する
- ZipArchive::locateName — アーカイブ内のエントリのインデックスを返す
- ZipArchive::open — ZIP ファイルアーカイブをオープンする
- ZipArchive::renameIndex — インデックスを使用してエントリ名を変更する
- ZipArchive::renameName — 名前を使用してエントリ名を変更する
- ZipArchive::setArchiveComment — ZIP アーカイブのコメントを設定する
- ZipArchive::setCommentIndex — インデックスを使用してエントリのコメントを設定する
- ZipArchive::setCommentName — 名前を使用してエントリのコメントを設定する
- ZipArchive::statIndex — インデックスを使用してエントリの詳細を取得する
- ZipArchive::statName — 名前を使用してエントリの詳細を取得する
- ZipArchive::unchangeAll — アーカイブに対するすべての変更を取り消す
- ZipArchive::unchangeArchive — アーカイブ全体に対して行われたすべての変更を取り消す
- ZipArchive::unchangeIndex — 指定したインデックスのエントリに対するすべての変更を取り消す
- ZipArchive::unchangeName — 指定した名前のエントリに対するすべての変更を取り消す
webmaster at sebastiangrinke dot info
06-Oct-2011 01:30
Jerry dot Saravia at emc dot com
08-Aug-2011 01:57
The following code can be used to get a list of all the file names in a zip file.
<?php
$za = new ZipArchive();
$za->open('theZip.zip');
for( $i = 0; $i < $za->numFiles; $i++ ){
$stat = $za->statIndex( $i );
print_r( basename( $stat['name'] ) . PHP_EOL );
}
?>
anonymous at example dot net
28-Jul-2011 11:18
status - libzip error code (ER_*)
statusSys - copy of errno (E*) or zlib error code
ER_OK N No error
ER_MULTIDISK N Multi-disk zip archives not supported
ER_RENAME S Renaming temporary file failed
ER_CLOSE S Closing zip archive failed
ER_SEEK S Seek error
ER_READ S Read error
ER_WRITE S Write error
ER_CRC N CRC error
ER_ZIPCLOSED N Containing zip archive was closed
ER_NOENT N No such file
ER_EXISTS N File already exists
ER_OPEN S Can't open file
ER_TMPOPEN S Failure to create temporary file
ER_ZLIB Z Zlib error
ER_MEMORY N Malloc failure
ER_CHANGED N Entry has been changed
ER_COMPNOTSUPP N Compression method not supported
ER_EOF N Premature EOF
ER_INVAL N Invalid argument
ER_NOZIP N Not a zip archive
ER_INTERNAL N Internal error
ER_INCONS N Zip archive inconsistent
ER_REMOVE S Can't remove file
ER_DELETED N Entry has been deleted
h-fate at gmx dot net
05-Oct-2010 04:17
Be wary that there are several algorithms to generate a zip file. I found that Office OpenXML files created with ZipArchive are not recognized by Excel 2007, for example.
You have to use a different class to zip in this case, such as PclZip.
hardcorevenom at gmx dot com
15-Jun-2010 03:17
Read a file from an archive to a variable.
A warning is printed automatically in case of a CRC32 mismatch, which we capture, so we can print our own error message.
<?php
$zip = new ZipArchive();
if ($zip->open('archive.zip')) {
$fp = $zip->getStream('myfile.txt'); //file inside archive
if(!$fp)
die("Error: can't get stream to zipped file");
$stat = $zip->statName('myfile.txt');
$buf = ""; //file buffer
ob_start(); //to capture CRC error message
while (!feof($fp)) {
$buf .= fread($fp, 2048); //reading more than 2156 bytes seems to disable internal CRC32 verification (bug?)
}
$s = ob_get_contents();
ob_end_clean();
if(stripos($s, "CRC error") != FALSE){
echo 'CRC32 mismatch, current ';
printf("%08X", crc32($buf)); //current CRC
echo ', expected ';
printf("%08X", $stat['crc']); //expected CRC
}
fclose($fp);
$zip->close();
//Done, unpacked file is stored in $buf
}
?>
To create a corrupt file, change a byte in a zip file using a hex editor.
