Download über php Steuern

FlashMX

Mitglied
Hallo,

ich habe folgenden Code:

Code:
$secretFolderPath = 'dwl/';
$fileName='datei.exe';//1000 MB groß
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header('Content-Description: File Transfer');
header('Content-Type: application/otrkey');
header('Content-Length: '.@filesize($secretFolderPath.$fileName));
header("Content-Disposition: attachment; filename=".$fileName);
header("Content-Transfer-Encoding: binary");
@readfile($secretFolderPath.$fileName);

dieser soll einen Download starten der eine 1000 MB große Datei enthält, aber es geht nix los. Nach mehreren Minuten spukt dann der IE sinlosen Text aus, bzw. beim Oper geht es manchmal los, aber dann ist die Datei fehlerhaft.
Was kann es sein und was kann ich machen.

Ich vermute das es ein Timeout problem sein kann?

mfg
 
Moeglicherweise koennte es helfen einen eventuellen Fehler bei readfile() nicht zu unterdruecken.
Weiterhin koennte es vielleicht auch nicht schlecht sein mit fopen() zu arbeiten und die Datei dann "haeppchenweise" auszuliefern. Ich weiss nicht genau wie readfile() arbeitet, aber wenn es vielleicht erst versucht die ganze Datei zu lesen und dann alles auf einen Schlag ausgeben will ist dies ja quasi zum Scheitern verurteilt. Dies laesst sich auf jeden Fall mit fopen() umgehen.

Hier mal ein Script wo ich dies nutze. Im Beispiel anhand eines ISO-Files von FreeBSD, welches ja auch etwas mehr als nur ein paar MB hat. ;)
PHP:
<?php
$file='FreeBSD-6.0-BootOnly.iso';
$kbs=250;
$createlogs=false;
if ((is_file($file)) && (is_readable($file)))
	{
		$dlfile=fopen($file,'r');
	}
else
	{
		die('Cannot open '.$file);
	}
$path=explode('/',$file);
$name=array_splice($path,-1);
$name=$name[0];
$path=implode('/',$path);
if (empty($path))
	{
		$path='./';
	}
$size=filesize($file);
if ((is_writable($path)) && ($createlogs==true))
	{
		$logfile=fopen($file.'.dl-'.time().'.log','a');
		$sentbytes=0;
	}
else
	{
		$logfile=false;
	}
header('Content-Type:application/octet-stream');
header('Content-Disposition:attachment;filename="'.$name.'"');
header('Content-Length:'.$size);
while (!feof($dlfile))
	{
		$bytes=1024;
		if ($kbs>0)
			{
				$bytes*=$kbs;
			}
		echo fread($dlfile,$bytes);
		flush();
		if ($logfile!=false)
			{
				$sentbytes+=$bytes;
				ftruncate($logfile,0);
				fwrite($logfile,$size." Bytes total\n");
				if ($sentbytes<$size)
					{
						fwrite($logfile,$sentbytes.' Bytes sent');
					}
				else
					{
						fwrite($logfile,'complete');
					}
				fwrite($logfile,"\n");
			}
		if ((!feof($dlfile)) && ($kbs>0))
			{
				sleep(1);
			}
	}
if ($logfile!=false)
	{
		fclose($logfile);
	}
fclose($dlfile);
?>
 
@Dennis Wronka

Ist es möglich das dieses Script durch PHP-Script Laufzeitbeschränkungen terminiert wird? Bekomme damit nämlich -je nach DL-Speed- ca. 25mb geladen und der Download stoppt. Gibt es da einen alternativen Lösungsweg?

gruss SpiegelTV
 
Man kann es auch so lösen.

Code:
$time = time();
	    if(!is_dir("./tmp/")){
	        mkdir("./tmp/", 0777);
	    }
	    mkdir("./tmp/".$time, 0777);
	    symlink($_SERVER['DOCUMENT_ROOT']."folder/".$fileName, "./tmp/".$time."/".$fileName);
	    header("Location: ./tmp/".$time."/".$fileName);
 
@Dennis Wronka

Ist es möglich das dieses Script durch PHP-Script Laufzeitbeschränkungen terminiert wird? Bekomme damit nämlich -je nach DL-Speed- ca. 25mb geladen und der Download stoppt. Gibt es da einen alternativen Lösungsweg?

gruss SpiegelTV
Moeglicherweise schon, man muesste mal testen wie lang es denn dauert eine 1GB grosse Datei einfach zu lesen und auszugeben. sleep(), was in meinem Script ja zur Limitierung der Downloadgeschwindigkeit genutzt wird, wird meines Wissens nach nicht bei der Ausfuehrungszeit hinzugezaehlt, diese Info hab ich auch grad in der PHP-Doku nochmal finden koennen.
Ich werd gleich mal ein wenig testen.

Man kann es auch so lösen.

Code:
$time = time();
	    if(!is_dir("./tmp/")){
	        mkdir("./tmp/", 0777);
	    }
	    mkdir("./tmp/".$time, 0777);
	    symlink($_SERVER['DOCUMENT_ROOT']."folder/".$fileName, "./tmp/".$time."/".$fileName);
	    header("Location: ./tmp/".$time."/".$fileName);
Auch wenn natuerlich meist Linux dem Webserver Leben verleiht, unter Windows ist dies keine Option, denn da gibt es die Funktion symlink() nicht.
Ausserdem kann es auch zu Rechteproblemen kommen wenn man mit Symlinks arbeitet.
 
Zurück