【发布时间】:2014-11-05 13:30:51
【问题描述】:
我正在构建一个 php 程序,它会上传一个 zip 文件,将其解压缩并为解压缩文件夹中的特定文件生成一个链接。上传和提取文件夹工作正常。现在我有点卡住下一步该做什么。我必须处理刚刚提取的文件夹并找到其中的(唯一)html 文件。然后必须生成指向该文件的链接。
这是我目前使用的代码:
$zip = new ZipArchive();
if ($zip->open($_FILES['zip_to_upload']['name']) === TRUE)
{
$folderName = trim($zip->getNameIndex(0), '/');
$zip->extractTo(getcwd());
$zip->close();
}
else
{
echo 'Es gab einen Fehler beim Extrahieren der Datei';
}
$dir = getcwd();
$scandir = scandir($dir);
foreach ($scandir as $key => $value)
{
if (!in_array($value,array(".",".."))) //filter . and .. directory on linux-systems
{
if (is_dir($dir . DIRECTORY_SEPARATOR . $value) && $value == $folderName)
{
foreach (glob($value . "/*.html") as $filename) {
$htmlFiles[] = $filename; //this is for later use
echo "<a href='". SK_PICS_SRV . DIRECTORY_SEPARATOR . $filename . "'>" . SK_PICS_SRV . DIRECTORY_SEPARATOR . $filename . "</a>";
}
}
}
}
所以这段代码似乎可以工作。我刚刚注意到一个相当奇怪的问题。 $zip->getNameIndex[0] 函数的行为取决于创建 zip 文件的程序。当我用 7zip 制作一个 zip 文件时,一切似乎都没有问题。 $folderName 包含我刚刚提取的主文件夹的正确名称。例如“文件夹 01”。但是当我用普通的 Windows zip 程序压缩它时,excat 相同的文件夹(相同的结构和相同的包含文件) $zip->getNameIndex[0] 包含错误的值。例如“文件夹 01/images/”或“文件夹 01/example.html”。所以它似乎以不同的方式/以错误的方式读取 zip 文件。你们知道该错误来自哪里或我如何避免它?这对我来说真的很奇怪。
【问题讨论】:
-
您必须转到提取文件的文件夹,通读该文件夹以找到文件并根据该信息生成链接。
-
您是否有可能通过您的代码进行调试,这样您就可以检查哪里有遗漏或错误?似乎 $value 可能为空。每个循环中 $value 的值是多少?
-
尝试使用 DIRECTORY_SEPARATOR 而不是 DS。我要禁食,因为没有你自己定义的 DS 常数,我很抱歉
-
所以它似乎工作了!我更新了我的帖子以解决最后一步。
-
您可以将上传的文件夹提取到带有时间戳或某事物的子文件夹中。就像它的名字一样,所以你参考这个,或者你检查文件夹的修改日期选择最新的(应该是刚刚上传的;见stat-function)