PHP :: Aufgabe #196
2 Lösungen

Erzeugung einer passenden .html Datei für Dateien in einem Ordner
Fortgeschrittener - PHP
von Holzi
- 24.09.2018 um 13:22 Uhr
In dieser Aufgabe wollen wir automatisiert eine HTML-Datei erzeugen, mit der Medien angezeigt werden können. Dies machen wir, da unser Kunde Video und Bilddateien in einem Ordner ablegen möchte und wir diese anzeigen müssen. Eine einfache Anzeige der Bild/Video-Datei ist nicht möglich, da wir mit JavaScript die Dauer des Videos übermitteln wollen (Das ist aber nicht Bestandteil der eigentlichen Aufgabe und dient nur zur Erklärung).
Wir haben also eine Ordnerstruktur, in der der Kunde einen Ordner erstellt und eine Bild- oder Videodatei einfügt.
Wir erzeugen in diesen Ordnern eine index.html Datei:
Diese index.html Datei soll das Medium als Vollbild anzeigen (und das Video soll automatisch abgespielt werden).
Zusatzaufgabe: Die erstellten index.html Dateien sollen in einer Dauerschleife abwechselnd angezeigt werden. Dabei soll jede Bilddatei 15 Sekunden lang angezeigt werden, das Video exakt so lange, bis es zu Ende ist.
Wir haben also eine Ordnerstruktur, in der der Kunde einen Ordner erstellt und eine Bild- oder Videodatei einfügt.
ordner1 → image.jpg
ordner2 → video.mp4
Wir erzeugen in diesen Ordnern eine index.html Datei:
ordner1 → image.jpg, index.html
ordner2 → video.mp4, index.html
Diese index.html Datei soll das Medium als Vollbild anzeigen (und das Video soll automatisch abgespielt werden).
Zusatzaufgabe: Die erstellten index.html Dateien sollen in einer Dauerschleife abwechselnd angezeigt werden. Dabei soll jede Bilddatei 15 Sekunden lang angezeigt werden, das Video exakt so lange, bis es zu Ende ist.
Lösungen:
Die Skripte index.php und Builder.php liegen im selben Verzeichnis.
Die Ordner "bild" und "video" sind ebenfalls im selben Verzeichnis.
Für jedes Bild / Video das sich in diesem Ordner bzw. in einem darin enthaltenen Unterordner befindet wird eine
Index-Datei mit folgender Benamung erzeugt: "index_<DATEINAME>.html"
Diese Datei landet, wie in der Aufgabe verlangt, im selben Verzeichnis wie das Bild / Video.
Video als auch Bild haben die volle Seitengröße, das Video wird automatisch abgespielt.
In die jeweilige Index-Datei wird zusätzlich unten ein Feld mit einigen Informationen eingeblendet.
index.php
HTML-Code
PHP-Code
Builder.php
PHP-Code
Die Ordner "bild" und "video" sind ebenfalls im selben Verzeichnis.
Für jedes Bild / Video das sich in diesem Ordner bzw. in einem darin enthaltenen Unterordner befindet wird eine
Index-Datei mit folgender Benamung erzeugt: "index_<DATEINAME>.html"
Diese Datei landet, wie in der Aufgabe verlangt, im selben Verzeichnis wie das Bild / Video.
Video als auch Bild haben die volle Seitengröße, das Video wird automatisch abgespielt.
In die jeweilige Index-Datei wird zusätzlich unten ein Feld mit einigen Informationen eingeblendet.
index.php

<!DOCTYPE html> <html> <head> <title>#196</title> <meta charset="utf-8"> <style type="text/css"> * { font-family: Arial, Tahoma; background-color: #cccccc; } p { font-size: 1.1em; } table { font-weight: bold; } </style> </head> <body> <h1>#196</h1> <hr /> <p>Programm für die Erzeugung von HTML-Dateien, welche jeweils die gefundenen Dateien darstellen / abspielen.</p> <table> <tr> <td>Author:</td> <td> </td> <td><span style="color:red; font-size: 1.75em;">Expcetion</span></td> </tr> <tr> <td>Version:</td> <td> </td> <td><span style="font-size: 1.75em;">0.1</span></td> </tr> </table> <hr /> </body> </html>

<?php require 'Builder.php'; $folder = array('bild' => 'bild', 'video' => 'video'); try { $builder = new Builder($folder); $builder->GrabFiles(); $builder->GenerateHtml(); } catch (Exception $ex) { echo '<p style="color:red;">'.$ex->getMessage().'</p>'; } ?>
Builder.php

<?php class Builder { /** * Assoc Array, in dem die Ordner enthalten sind. */ public $folder; /** * Assoc Array, in dem alle Dateien enthalten sind. */ public $files; /** * Assoc Array, in dem alle erlaubten Dateiendungen enthalten sind. */ private $extensions = array('bild' => array('jpg', 'png', 'jpeg', 'gif'), 'video' => array('mp4')); public function Builder($folder) { if(!$this->ValidateDirectory($folder['bild'])) { throw new Exception('Pfad zum Bild-Verzeichnis ungültig.', 1); } else if(!$this->ValidateDirectory($folder['video'])) { throw new Exception('Pfad zum Video-Verzeichnis ungültig.', 1); } $this->folder = $folder; } /** * @param Pfad des Ordners * @return Boolean */ private function ValidateDirectory($dir) { return is_dir($dir); } /** * Sammelt alle Dateien in allen Ordnern von $folder ein. * Filtert zudem alle Ordner ('.', '..', '.../subdir') heraus. */ public function GrabFiles() { foreach ($this->folder as $currentfolder) { $items = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($currentfolder), RecursiveIteratorIterator::SELF_FIRST); $this->files[$currentfolder] = array(); foreach ($items as $item) { if(is_file($item->getPathname()) && in_array($item->getExtension(), $this->extensions[$currentfolder])) { array_push($this->files[$currentfolder], $item); } } } } /** * Erzeugt die Html-Dateien für die gefundenen Dateien. * Benamung: index_<DATEINAME>.html */ public function GenerateHtml() { $html = array(); foreach ($this->folder as $currentfolder) { foreach ($this->files[$currentfolder] as $currentfile) { $temp = '<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1">'; $temp .= '<title>'.$currentfile->getBasename().'</title>'; $temp .= '<meta charset="utf-8">'; $temp .= '<style type="text/css">'.$this->InsertSpecificCss($currentfile).'</style></head>'; $temp .= '<body>'.$this->InsertSpecificBody($currentfile).'</body></html>'; array_push($html, array('file' => $currentfile, 'html' => $temp)); } } $this->GenerateFiles($html); } /** * Fügt den CSS-Teil in die Html-Datei ein. * @param SplFileInfo $file * @return string, das CSS */ private function InsertSpecificCss($file) { $css = 'body, html { height: 100%; margin: 0; padding: 0; font-family: Arial, Tahoma; } '; $css .= '.myContent { position: fixed; bottom: 0; background: rgba(0, 0, 0, 0.5); color: #f1f1f1; width: 100%; padding: 20px; } '; if(in_array($file->getExtension(), $this->extensions['bild'])) { $css .= '.myImage { background-image: url("'.$file->getBasename().'"); height: 100%; background-position: center; background-repeat: no-repeat; background-size: cover; } '; } else { $css .= '.myVideo { position: fixed; right: 0; bottom: 0; min-width: 100%; min-height: 100%; } '; } return $css; } /** * Fügt den Body in die Html-Datei ein. * @param SplFileInfo $file * @return string, der Body-Teil */ private function InsertSpecificBody($file) { $html = ''; if(in_array($file->getExtension(), $this->extensions['bild'])) { $html = '<div class="myImage"></div>'; } else { $html = '<video autoplay loop class="myVideo"><source src="'.$file->getBasename().'" type="video/mp4"></video>'; } $html .= '<div class="myContent"><p>'.$this->insertInformation($file).'</p></div>'; return $html; } /** * Fügt in DIV mit der Klasse "myContent" Informationen über die Datei ein. * @param SplFileInfo $file * @return string, Infos / Details */ private function insertInformation($file) { $info = '<table>'; $info .= '<tr><td>Dateiname</td><td> </td><td>'.$file->getBasename().'</td></tr>'; if(in_array($file->getExtension(), $this->extensions['bild'])) { $imageinformation = getimagesize($file); $imagekeys = array_keys($imageinformation); $info .= '<tr><td>Größe</td><td> </td><td>'.$imageinformation[0].' x '.$imageinformation[1].' px</td></tr>'; if(in_array('bits', $imagekeys)) { $info .= '<tr><td>Bits</td><td> </td><td>'.$imageinformation['bits'].'</td></tr>'; } } if(in_array($file->getExtension(), $this->extensions['video'])) { // Zusätzliche Video-Infos hier einfügen } $info .= '</table>'; return $info; } private function GenerateFiles($html) { foreach ($html as $currentHtml) { $filepath = str_replace('.', '_', $currentHtml['file']->getRealPath()).'.html'; $handle = fopen($filepath, 'w'); if($handle === FALSE) { echo '<p style="color:red;">Erzeugen der Datei "'.$filepath.'" fehlgeschalgen!</p>'; continue; } if(fwrite($handle, $currentHtml['html']) === FALSE) { echo '<p style="color:red;">Das Schreiben in die Datei "'.$filepath.'" war <u>nicht</u> erfolgreich!</p>'; } else { echo '<p style="color:green;">Die Datei "'.$filepath.'" wurde erfolgreich erzeugt!</p>'; } fclose($handle); } } } ?>

<!DOCTYPE html> <html> <head> <title>Autoplay</title> </head> <body> <p>Unterstützte Dateiformate: MP4, JPG, PNG</p> <form method="POST"> Bitte hier Pfad zum Bildordner eingeben:<br> <input type="text" name="imagepath" style="width: 400px;"><br> Bitte hier Pfad zum Videoordner eingeben:<br> <input type="text" name="videopath" style="width: 400px;"><br><br> <input type="submit" name=""> </form> </body> </html>

<?php if(isset($_POST['imagepath']) && isset($_POST['videopath'])) { $imagePath = $_POST['imagepath']; $videoPath = $_POST['videopath']; //Check Picture checkFileEnding($imagePath, "image"); checkFileEnding($videoPath, "video"); createImageHtmlFile($imagePath); createVideoHtmlFile($videoPath); } function checkFileEnding($FilePath, $type) { $erg = false; $FilePathParts = pathinfo($FilePath); if(is_file($FilePath)) { if($type == "image") { if($FilePathParts['extension'] == "jpg" || $FilePathParts['extension'] == "png") { $erg = true; } else { echo "<br>Imagefile is no valid type!"; $erg = false; } } if($type == "video") { if($FilePathParts['extension'] == "mp4") { $erg = true; } else { echo "<br>Videofile is no valid type!"; $erg = false; } } } else { echo "<br>File ist not a File! Check Path!"; $erg = false; } return $erg; } function getFilename($path) { $FilePathParts = pathinfo($path); $erg = $FilePathParts['basename']; return $erg; } function getFiledir($path) { $FilePathParts = pathinfo($path); $erg = $FilePathParts['dirname']; return $erg; } function createImageHtmlFile($imgUrl) { $path = getFiledir($imgUrl) . "\index.html"; $filename = getFilename($imgUrl); $handle = fopen($path, "w"); fwrite($handle, "<!DOCTYPE html> <html> <head> <title></title> </head> <body> <img src=\"" . (string)$filename . "\" style=\"width:100%; height: auto;\"> </body> <style> body{margin: 0;} </style> </html>"); fclose($handle); } function createVideoHtmlFile($mp4Url) { $path = getFiledir($mp4Url) . "\index.html"; $filename = getFilename($mp4Url); $handle = fopen($path, "w"); fwrite($handle, "<!DOCTYPE html> <html> <head> <title></title> </head> <body> <video style=\"width:100%; height: auto;\"controls autoplay><source src=\"" . (string)$filename . "\" type=\"video/mp4\"></video> </body> <style> body{margin: 0;} </style> </html>"); fclose($handle); } ?>