Эта тема на forum.dklab.ru


Rin: zip_extract_array: Извлекает файлы из ZIP файла в ассоциативный массив

/**
* Извлекает файлы из ZIP файла в ассоциативный массив.
* Ключами массива являются названия файлов (с путями), значениями их содержимое.
* Если файл не удается открыть или расширение ZIP не поддерживается в PHP, возвращает false.
*
* @param string $filename
* @return mixed(array/false)
* @see srl_extract(), zip_*()
*
* @author Nasibullin Rinat <n a s i b u l l i n at starlink ru>
* @charset ANSI
* @version 1.0.0
*/
function zip_extract_array($filename)
{
if (function_exists('zip_open') && $zip = zip_open($filename))
{
$data = array();
while ($zip_entry = zip_read($zip))
{
zip_entry_open($zip, $zip_entry, 'r');
$data[zip_entry_name($zip_entry)] = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
zip_entry_close($zip_entry);
}
zip_close($zip);
return $data;
}
return false;
}

Rumata:
ой не надо так делать. посмотрите в сторону http://pear.php.net/packages.php?catpid=33&catname=File+Formats
Rin:
100 килобайтный PEAR::Archive_Zip слишком "монстровый" для простой задачи распаковки файлов.
korchasa:
100 килобайтный PEAR::Archive_Zip слишком "монстровый" для простой задачи распаковки файлов.
"Монстровый" из-за своего веса (100Кб - ну жуть просто)? Или есть какие-то результаты тестирования ПРОИЗВОДИТЕЛЬНОСТИ?
LEVsu:
zip_open() требует указания полного пути от корня начиная с /home/
Это не всегда удобно. Поэтому для своих целей переделал ф-ию из взятую из документации
Теперь можно не писать полный путь, а писать начиная относительно текущей папки например dir/file.zip без слэша и точки с переди
Также поддерживается один отступ на предыдущую папку. Можно написать путь ../dir/file.zip

Кроме этого эта ф-я распаковывает с произвольным выбором типов файлов если указать $flist т.е будет извлекать только те типы файлов, которые переданы в $flist
Например
$flist=array(".htm",".html",".xhtml",".txt",".jpg",".JPG",".jpeg",".JPEG",".png",".gif",".mmf",".midi",".mid",".mp3",".GIF",".zip","gz2",".sis",".sisx",".rar",".jar",".jad",".mpeg",".MPEG");
Если нужно наоборот извлеч любые файлы кроме указаных, то можно в условии "if($flist===false || in_array(strrchr($fpat, "."),$flist))" перед in_array() поставить восклицательный знак
Если $flist не указан, то будет извлекать все подряд


function Unzip_mod($path_file, $flist=false, $destiny="")
{

if(getcwd() && !preg_match('/^\/home/',$path_file,$p)){
$getc=str_replace('\\','/',getcwd());
$path_file=preg_replace('/^\w:/','',$getc).'/'.$path_file;
$path_file=preg_replace('/\/[\w\-_]+\/\.\./','',$path_file);
//echo $path_file.'<br>';
}
preg_match('/([\/\w\-_.]+)\/([\w\-_.]+)\.([\w]{1,5})/',$path_file,$p);
//$file=$p['2'].".".$p['3'];
$dir=$p['1'].'/';

$zip = zip_open($path_file);
$_tmp = array();
$count=0;
if ($zip)
{
while ($zip_entry = zip_read($zip))
{
$_tmp[$count]["filename"] = zip_entry_name($zip_entry);
$_tmp[$count]["stored_filename"] = zip_entry_name($zip_entry);
$_tmp[$count]["size"] = zip_entry_filesize($zip_entry);
$_tmp[$count]["compressed_size"] = zip_entry_compressedsize($zip_entry);
$_tmp[$count]["mtime"] = "";
$_tmp[$count]["comment"] = "";
$_tmp[$count]["folder"] = dirname(zip_entry_name($zip_entry));
$_tmp[$count]["index"] = $count;
$_tmp[$count]["status"] = "ok";
$_tmp[$count]["method"] = zip_entry_compressionmethod($zip_entry);

if (zip_entry_open($zip, $zip_entry, "r"))
{
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
if($destiny)
{
$path_file = $destiny . zip_entry_name($zip_entry);
}
else
{
$path_file = $dir . zip_entry_name($zip_entry);
}
$new_dir = dirname($path_file);

// Create Recursive Directory
if(!file_exists($new_dir))mkdir($new_dir);
$fpat=$dir . zip_entry_name($zip_entry);

if(!preg_match('/\/$/',$fpat,$p)){
if($flist===false || in_array(strrchr($fpat, "."),$flist)){
$fp = fopen($fpat, "w");
fwrite($fp, $buf);
fclose($fp);
}
}
zip_entry_close($zip_entry);
}
$count++;
}
zip_close($zip);
}
}

Rin:
В PHP появился замечательный класс ZipArchive.
Для работы с ZIP архивами лучше всего использовать его.
bæv:
Перенесено из форума: Склад готовых решений :: PHP.
Перенесено в форум: Разное :: PHP.

Эта тема на forum.dklab.ru