Allgemein PHP Snippets

PHP Download mit Callback

Hi,

nach etwas längerer Zeit mal wieder ein nützliches Snippet 😉

Mit dieser funktion könnt ihr mit PHP eine Datei herunterladen und bekommt einen Callback mit der Prozentzahl.
Die Funktion benötigt 2 andere Funktionen, einmal die funktion urlfilesize welche ermöglicht die Größe von Dateien zu ermitteln und eine Callback-Funktion.

Code

<?php
/**
* Download mit Callback
* @param String $url Die Datei die Heruntergeladen werden soll
* @param String $dest Die Zieldatei
* @param String $callback Die Callbackfunktion die bei Prozentänderung aufgerufen werden soll
*/
function downloadWithCallback($url, $dest, $callback)
{
	// Prüfe ob die Datei schon vorhanden ist, wenn ja lösche sie
	if(is_file($dest))
	{
		unlink($dest);
	}
	// Erstelle ein fopen Handle
	$handle = fopen($url, "r");
	// Ermittle die Dateigröße der Datei die Heruntergeladen werden soll
	$fsize = urlfilesize($url);
	// Variable die die Anzahl der empfangenen Bytes speichert
	$bytes = 0;
	// Byte für Byte den Stream durchgehen
	while($data = fread($handle, 1024))
	{
		// Addiere zu $byte die anzahl der $data bytes
		$bytes += strlen($data);			
		// Schreibe die Bytes in die Datei
		file_put_contents($dest, $data, FILE_APPEND);
		// Berechne den aktuellen Fortschritt
		$new_percent = round(($bytes / $fsize) * 100, 2);
		// Wenn sich der Fortschritt verändert hat...
		if($new_percent != $percent)
		{
			// ... aktualisiere die $percent variable mit der aktuellen Prozentzahl ...
			$percent = $new_percent;
			// ... und rufe die Callback funktion auf
			$callback($percent));
		}
	}
}
/**
 * Die Callbackfunktion
 * @param Double $prozent die aktuelle Prozentzahl
 */
function callback($prozent)
{
	/**
	 * @todo Callback code
	 */
}
/**
 * Ermittelt die Größe einer Datei
 * @param String $url Die URL der Datei
 * @return Integer Die größe der Datei in Bytes
 */
function urlfilesize($url) {
	if (substr($url,0,4)=='http')
	{
		$x = array_change_key_case(get_headers($url, 1),CASE_LOWER);
		$x = $x['content-length'];
	}
	else 
	{
		$x = @filesize($url); 
	}
	return $x;
}
?>

Beispiel

<?php
echo "Downloading <b>samplefile.zip</b>: <span id='percent'>0%</span>";
flush();
downloadWithCallback("http://example.com/samplefile.zip", "samplefile.zip", "callback");
/**
 * Die Callbackfunktion
 * @param Double $prozent die aktuelle Prozentzahl
 */
function callback($prozent)
{
	// Code zum aktualisieren des Spans
	print("
		<script>
			top.document.getElementById('percent').innerHTML = ('".$prozent."%');
			// Speicher nicht vollmüllen
			var element = document.getElementsByTagName('script');
			for (index = element.length - 1; index >= 0; index--) {
			    element[index].parentNode.removeChild(element[index]);
			}
		</script>");
	flush();
}
?>

Viel Spaß damit 😉

Gruß,
Julian


2443x gelesen

Print Friendly, PDF & Email

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.