2014-11-05 4 views
2

Я создаю программу php, которая загружает zip-файл, извлекает его и создает ссылку для определенного файла в извлеченной папке. Загрузка и извлечение папки работает нормально. Теперь я немного застрял, что делать дальше. Мне нужно просто открыть извлеченную папку и найти (только) html-файл, который находится в нем. Затем необходимо создать ссылку на этот файл.Извлеките папку, а затем найдите конкретный файл в PHP

Вот код I'm, используя в настоящее время:

$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-файл. Когда я делаю zip-файл с 7zip, все, кажется, работают без проблем. $ folderName содержит правильное имя основной папки, которую я только что извлек. Например, «папка 01». Но когда я застегиваю его с помощью обычной программы zip для Windows, вы получаете такую ​​же папку (ту же структуру и те же файлы), что и $ zip-> getNameIndex [0] содержит неправильное значение. Например, например, «папка 01/images /» или «папка 01/example.html». Таким образом, кажется, что файл zip по-разному/неверно. Вы, ребята, знаете, откуда эта ошибка, или как я могу ее избежать? Мне это действительно кажется странным.

+0

Вы должны пойти в папку, куда были извлечены файлы, прочитайте это, чтобы найти файл и создать ссылку на основе этой информации. –

+0

У вас есть возможность отлаживать ваш код, чтобы вы могли проверить, где что-то отсутствует или не так? Кажется, что $ value может быть пустым. Каковы значения $ value в каждом цикле? – empiric

+0

попробуйте DIRECTORY_SEPARATOR вместо DS. я должен был поститься с этим, так как нет константы DS, которую вы не определяете для себя, я извиняюсь – empiric

ответ

1

Поскольку вы задаете экстракт путь самостоятельно, вы можете попробовать найти свой файл с помощью функции «Глоб» РНР

взглянуть на руководство:

Glob

Эта функция вернет имя файла, соответствующего шаблону поиска. С вашим пути вытяжки теперь у вас есть ссылка на файл.

$dir = "../../suedkurier/werbung/" 
$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)) 
    { 
     foreach (glob($dir . DIRECTORY_SEPARATOR . $value . "/*.html") as $filename) { 
      $files[] = $value . DIRECTORY_SEPARATOR $filename; 
     } 
    } 
    } 
} 

совпавшие файлы будут сохранены в массиве $ файлов (с вложенной) Таким образом, вы получите свой путь

foreach($files as $file){ 
    echo $dir . DIRECTORY_SEPARATOR . $file; 
} 
+0

спасибо за ответ. Это работает, если файл находится в общей папке «../../suedkurier/werbung/».Но в моем случае вся сложная папка лежит на этом пути. Поэтому он будет выглядеть примерно так: «../../suedkurier/werbung/folder1/» И мне нужно найти папку1 для html-файла. Я хочу загрузить много папок, поэтому, когда есть папка3, она должна найти html этой конкретной папки. Я заранее не знаю имя извлеченных папок. –

+0

Итак, вы можете попытаться совместить мой ответ с ответом Джеймса. Попробуйте использовать scandir для поиска папок (например, folder1, folder2 и т. Д.) (Проверьте каталог с is_dir()), которые извлекаются, а затем вы можете использовать функцию glob в этих каталогах. В этом случае у вас есть 2 вложенных петли foreach – empiric

+0

Это звучит хорошо. К сожалению, я довольно новичок в PHP и борюсь с написанием кода. Не могли бы вы разместить полный код в качестве ответа здесь? Это было бы очень полезно. –

1
$dir = "the/Directory/You/Extracted/To"; 
$files1 = scandir($dir); 
foreach($files1 as $str) 
{ 
    if(strcmp(pathinfo($str, PATHINFO_EXTENSION),"html")===0||strcmp(pathinfo($str, PATHINFO_EXTENSION),"htm")===0) 
    { 
     echo $str; 
    } 

} 

Получить массив каждого файла в каталоге, проверьте расширение каждого из них для HTM/HTML, а затем повторить имя, если оно истинно.

Смежные вопросы