problem mit php download

Iced-T

Grünschnabel
Ich habe auf meiner seite einen iframe indem sich meine eigentliche homepage befindet
ich starte einen download von meiner seite mit folgendem link
<a style='color:green;' href='download.php?dlfile=".$prog.".".$e."' target='SiteFrame'>test</a>
die variablen $prog und $e werden mit einem dateinamen und der extension gefüllt das funktionert auch also der dateidownload startet korrekt nun wollte ich aber das der html bereich der download.php im siteframe geöffnet wird um zum beispiel ein dankeschön für den download der datei dem benutzer auszugeben.

also ums auf den punkt zu bringen der dateidownload startet korrekt jedoch ist danach schluss, weiterer code wird nicht ausgegeben, nichtmal die seite wird im iframe geöffnet.
könnt ihr mir vllt. helfen und tipps geben was ich falsch mache.

meine download.php sieht folgendermaßen aus (besteht zum größten teil aus code den ich im internet gefunden habe ^^)

PHP:
<?php
	function GetParam($ParamName, $Method = "P", $DefaultValue = "")
	{
		if ($Method == "P") 
		{
			if (isset($_POST[$ParamName])) return $_POST[$ParamName]; else return $DefaultValue;
		} else if ($Method == "G") {
			if (isset($_GET[$ParamName])) return $_GET[$ParamName]; else return $DefaultValue;
		} else if ($Method == "S") {
			if (isset($_SERVER[$ParamName])) return $_SERVER[$ParamName]; else return $DefaultValue;
		}
	}
//<a href="download.php?dlfile=%progname%.%ext%">Download</a> 
	$dlfile = strtolower(GetParam("dlfile","G"));
	$result = "";
	if($dlfile != "")
	{
		$hiddenPath = "dl/";
		$dlfile_real = $hiddenPath.$dlfile;
		if(substr($dlfile, 0, 1) == "." || strpos($dlfile, "..") > 0 || substr($dlfile, 0, 1) == "/" || strpos($dlfile, "/") > 0)
		{
			$result = "Ein Fehler trat während des downloads auf!";
		}
		if (file_exists($dlfile_real))
		{
			$extension = strtolower(substr(strrchr($dlfile, "."), 1));
			switch($extension)
			{
				case "exe": $type = "application/octet-stream"; break;
				case "rar": $type = "encoding/x-compress"; break;
				case "zip": $type = "application/x-zip-compressed"; break;
				default: $type = "application/force-download"; break;
			}
			$header_file = (strstr($_SERVER["HTTP_USER_AGENT"], "MSIE")) ? preg_replace("/\./", "%2e", $dlfile, substr_count($dlfile, ".") - 1) : $dlfile;
			header("Pragma: public");
			header("Expires: 0");
			header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
			header("Cache-Control: public", false);
			header("Content-Description: File Transfer");
			header("Content-Type: " . $type);
			header("Accept-Ranges: bytes");
			header("Content-Disposition: attachment; filename=\"" . $header_file . "\";");
			header("Content-Transfer-Encoding: binary");
			header("Content-Length: " . filesize($dlfile_real));
			@readfile(§dlfile_real);
		}
		else
		{
			$result = "Datei existiert nicht!";
		}
	}
?>
HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="styles/style.css">
</head>
<body>
DANKE FÜR DEN DOWNLOAD
</body>
</html>

ich bedanke mich schonmal im vorraus für hilfreiche kommentare!
 
Spontan fällt mir nur der Fehler in folgender Anweisung auf:
PHP:
@readfile(§dlfile_real);
Der Inhaltstyp „application/force-download“ existiert übrigens nicht. Stattdessen solltest du „application/octet-stream“ verwenden.
 
Statt dem Paragraphenzeichen ein Dollarzeichen?

Immerhin ist das Paragraphenzeichen kein gültiges PHP Element ;)
 
ok ok die zeile hab ich ersetzt durch

ich hab die original funktion noch in nem forum gefunden die ich hier verwende und hab die falsche zeile durch das hier ersetzt

PHP:
			if ($stream = fopen($dlfile_real, "r"))
			{
				while(!feof($stream) && connection_status() == 0)
				{
					set_time_limit(0);
					print(fread($stream,1024*8));
					flush();
				}
				fclose($stream);
			}
			header("Location: prog_toc.php");
das
PHP:
header("Location: prog_toc.php");
hab ich noch hintenran gehangen in der hoffnung das das weiterleiten klappt.
t aber auch nit, der download startet aber weiter passiert nix auch nicht nachdem ich auf download abbrechen geklickt habe.
 
und wie machen das da große download-portale die eine dankesseite laden anzeigen wie oft die datei heruntergeladen wurde und 5 sekunden danach den download starten? :(
 
In dem sie zuerst auf die Dankesseite weiterleiten und dann auf den Download (nach 5 Sekunden).

Alternativ kann man es auch mit Ajax (sprich JavaScript) machen. Seite laden, 5 Sekunden warten, dann das PHP Skript (bzw. eine Funktion) per asynchronen Request ansprechen.
 
Hi,

der Download wird erst anschließend per JS gestartet.
Also nach einem Timeout wird auf die Download Seite weitergeleitet.

Da dort ja ein "Content-Description: File Transfer" Header gesetzt ist, ändert sich der aktuelle Seiteninhalt auch nicht, sondern es öffnet sich lediglich das Downloadfenster.

Gruß tyg3r

/edit: zu langsam :)
 

Neue Beiträge

Zurück