Problem mit Header Download

Jose-l

Grünschnabel
Hallo, Ich habe volgendes Problem ich benutze seit einiger zeit einen Header Download das funktioniert auch wunderbar doch nun wo 100 MB files zum Download bereit stehen bekomme ich Probleme da das Script den Kompletten Ram volläd also bei 100 MB wird pro download der Ram mit 100 MB belastet, und so der server überlasstet ich habe schon gesucht aber keine lösung gefunden :(( hier mein Scriptteil ich hoffe mir kann jemand helfen.

$getfile ist der name der datei auf dem server
$filename2 ist der name wo beim Download angegeben wird
$size ist die Dateigröße

PHP:
$filename = "../files/$getfile";
 header("Cache-Control: no-store, no-cache, must-revalidate");
 header("Cache-Control: post-check=0, pre-check=0", false);
 header("Content-Transfer-Encoding: binary"); 
 header("Content-type: application/octet-stream"); 
 header("Content-Length: ".$size);
 header("Content-disposition: attachment; filename=".$filename2); 
 
  $fh = fopen($filename, "r");
 fpassthru($fh);

ob_flush();
flush();


Schonmal Danke für alle Antworten, Gruß Jose
 
Habe mal mit Readfile() probiert dann erhalte ich keine Datei mehr der Download startet zwar aber die Datei hat 0 KB und das mit dem Apache Webserver verstehe ich leider noch nicht ^^

also habe noch keine Lösung
 
Zuletzt bearbeitet:
Lies doch die Datei blockweise aus.
PHP:
while (!feof($fh))
{
 echo fread($fh,1024);
 flush();
}
Und wenn Du noch etwas mit der Blockgroesse rumspielst und hinter flush() noch sleep() einfuegst kannst Du sogar die Download-Geschwindigkeit begrenzen.
 
Hey danke das hat funktioniert habe auch mal das mit dem sleep() probiert das hört sich sehr interesant an. Aber sobald ich das hinter flush(), sleep() setzte dann bekomme ich wieder nur eine 0 KB datei raus. hm muss man da villeicht noch mehr beachten.
 
Eigentlich nicht.
Ich hatte das vorhin mal wie folgt bei mir getestet:
PHP:
<?php
$dlfile=@fopen('FreeBSD-6.0-BootOnly.iso','r');
if ($dlfile===false)
	{
		die('Cannot open file');
	}
$filesize=filesize('FreeBSD-6.0-BootOnly.iso');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="FreeBSD-6.0-BootOnly.iso"');
header('Content-Length: '.$filesize);
while (!feof($dlfile))
	{
		echo fread($dlfile,10240);
		flush();
		sleep(1);
	}
fclose($dlfile);
?>
Und die Datei wurde wie erwartet mit 10KB/s runtergeladen.

Nachtrag: Hast Du vielleicht vergessen bei sleep() die Zeit anzugeben?

Nachtrag 2: Ich hab das ganze grad mal ein wenig umgestrickt und etwas flexibler gemacht. Zum Beispiel faellt jetzt die letzte Pause weg da diese ja ziemlich unnoetig ist. Weiterhin koennen sowohl Dateiname als auch Downloadgeschwindigkeit ueber Variablen gesteuert werden. Wird $kbs (fuer die Download-Geschwindigkeit in KB/s) auf 0 gesetzt wird nicht limitiert.

PHP:
<?php
$filename='FreeBSD-6.0-BootOnly.iso';
$kbs=250;
if ((file_exists($filename)) && (is_readable($filename)))
	{
		$dlfile=fopen($filename,'r');
	}
else
	{
		die('Cannot open file');
	}
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Content-Length: '.filesize($filename));
while (!feof($dlfile))
	{
		$bytes=1024;
		if ($kbs>0)
			{
				$bytes*=$kbs;
			}
		echo fread($dlfile,$bytes);
		flush();
		if ((!feof($dlfile)) && ($kbs>0))
			{
				sleep(1);
			}
	}
fclose($dlfile);
?>
 
PHP:
$filename = "../files/$getfile";
 header("Cache-Control: no-store, no-cache, must-revalidate");
 header("Cache-Control: post-check=0, pre-check=0", false);
 header("Content-Transfer-Encoding: binary"); 
 header("Content-type: application/octet-stream"); 
 header("Content-Length: ".$size);
 header("Content-disposition: attachment; filename=".$filename2); 
 
  
$fh = fopen($filename, "r"); 

      while (!feof($fh))

      {

       echo fread($fh,1024);

       flush();

      } ;


so schaut jetzt das Script aus der Ram ist leider immer noch vollgeladen musste ich feststellen und das mit dem Sleep(); fuktioniert wohl auf meinem Server nicht -.-.
 
Zurück