我需要解压缩上传的内容。但出于安全目的,必须验证文件只是图像文件,以便有人无法将 php 添加到 zip 中然后稍后运行它。
在进行解压缩时,我还需要保留文件结构。
$zip->extractTo($save_path . $file_name, array('*.jpg','*.jpeg','*.png','*.gif') );
不返回空值。有没有我可以使用的参数,或者我必须使用正则表达式循环遍历 zip 文件以匹配扩展名并创建文件夹并使用代码保存文件?
谢谢
我需要解压缩上传的内容。但出于安全目的,必须验证文件只是图像文件,以便有人无法将 php 添加到 zip 中然后稍后运行它。
在进行解压缩时,我还需要保留文件结构。
$zip->extractTo($save_path . $file_name, array('*.jpg','*.jpeg','*.png','*.gif') );
不返回空值。有没有我可以使用的参数,或者我必须使用正则表达式循环遍历 zip 文件以匹配扩展名并创建文件夹并使用代码保存文件?
谢谢
来自php.net,处理 .txt 文件
<?php
$value="test.zip";
$filename="zip_files/$value";
$zip = new ZipArchive;
if ($zip->open($filename) === true) {
echo "Generating TEXT file.";
for($i = 0; $i < $zip->numFiles; $i++) {
$entry = $zip->getNameIndex($i);
if(preg_match('#\.(txt)$#i', $entry))
{
////This copy function will move the entry to the root of "txt_files" without creating any sub-folders unlike "ZIP->EXTRACTO" function.
copy('zip://'.dirname(__FILE__).'/zip_files/'.$value.'#'.$entry, 'txt_files/'.$value.'.txt');
}
}
$zip->close();
}
else{
echo "ZIP archive failed";
}
?>
对于将来需要这个的人来说,这是我的解决方案。感谢 Ciro 的帖子,我只需要扩展你的一点。为了确保创建了所有文件夹,我首先为文件夹循环,然后进行提取。
$ZipFileName = dirname(__FILE__)."/test.zip";
$home_folder = dirname(__FILE__)."/unziped";
mkdir($home_folder);
$zip = new ZipArchive;
if ($zip->open($ZipFileName ) === true)
{
//make all the folders
for($i = 0; $i < $zip->numFiles; $i++)
{
$OnlyFileName = $zip->getNameIndex($i);
$FullFileName = $zip->statIndex($i);
if ($FullFileName['name'][strlen($FullFileName['name'])-1] =="/")
{
@mkdir($home_folder."/".$FullFileName['name'],0700,true);
}
}
//unzip into the folders
for($i = 0; $i < $zip->numFiles; $i++)
{
$OnlyFileName = $zip->getNameIndex($i);
$FullFileName = $zip->statIndex($i);
if (!($FullFileName['name'][strlen($FullFileName['name'])-1] =="/"))
{
if (preg_match('#\.(jpg|jpeg|gif|png)$#i', $OnlyFileName))
{
copy('zip://'. $ZipFileName .'#'. $OnlyFileName , $home_folder."/".$FullFileName['name'] );
}
}
}
$zip->close();
} else
{
echo "Error: Can't open zip file";
}