PHP :: Aufgabe #196

2 Lösungen Lösungen öffentlich

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.

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:

vote_ok
von Exception (7090 Punkte) - 04.10.2018 um 15:07 Uhr
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
Quellcode ausblenden HTML-Code
<!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>
Quellcode ausblenden PHP-Code
<?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
Quellcode ausblenden PHP-Code
<?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);			
		}
	}
}

?>
vote_ok
von syneex (2670 Punkte) - 04.10.2018 um 15:09 Uhr
Quellcode ausblenden HTML-Code
<!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>
Quellcode ausblenden PHP-Code
<?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);
}
?>