HEADER: Downloads werden zerstört

  • Themenstarter Themenstarter ByeBye 8492
  • Beginndatum Beginndatum
B

ByeBye 8492

Download beginnt nicht

Moinsen,
ich habe mir heute einen Downloadstarter in PHP geschrieben.
Dieser klappt aufm Localhost Perfekt.

Im Internet allerdings geht er nur bis Dateien die kleiner als 5 MB sind. Danach kommt einfach eine weiße Seite - keine Fehler oder sonstiges :(.

PHP:
		 		 # Um die Extension zu kriegen nehmen wir den Namen, "exploden diesen" und in dem Array
 		 		 # können auch mehrere Punkte drinne sein, da wir immer das Letzte nehmen kriegen wir das richtige
 			 		 $ext 	 = explode(".", $file);
 		 		 $mime_type = $mime[ $ext[ count ( $ext ) - 1 ] ];
  
  				    header("HTTP/1.1 200 OK");
  			   	 header("Pragma: public");
 				 	 header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
 				 	 header("Cache-Control: public");
 				 	 header("Content-Description: File Transfer");
  			 
 				 header("Content-Type: $mime_type");
 			 	 header("Content-Length: $result[size]"); 			 
 				 header("Content-Disposition: attachment; filename=\"$result[file]\"");
 			 	 readfile( $file );

Das ist der Code der genutzt wird.
Der Server nutzt PHP 4.3.7 im Safe Mode.

Achso, das hier ist die gesamte Funktion die den Download startet:
PHP:
  function download(){
  	global $db,$prefix,$strError,$arrSecurity,$GeneralConfig,$mime;
  	$id	= $_GET['id'];
  	if(!is_numeric($id))	{$err[] = _idnumeric;}
  	if(empty($err)){	
  
 		$result	= $db -> fetch_array($db -> query("SELECT `parent_id`,`size`,`file` FROM `".$prefix."_download` where `broken` = 0 AND `id` = $id"));
 		$CatParent	= $db -> fetch_assoc($db -> query("SELECT `name`,`view` FROM `".$prefix."_download_cat` where `id` = ".$result['parent_id']));
  		if( access( $CatParent['view'] ) == 1){
  			if( blocked_referer() == 0)
  			{
 			 $db -> query("UPDATE `".$prefix."_download` set `downloads` = `downloads`+1 where `id` = $id");
 				$file = "download/".$result['file'];
  				if ( is_file ( $file )) 
  				{
 		 		 # Um die Extension zu kriegen nehmen wir den Namen, "exploden diesen" und in dem Array
 		 		 # können auch mehrere Punkte drinne sein, da wir immer das Letzte nehmen kriegen wir das richtige
 			 		 $ext 	 = explode(".", $file);
 		 		 $mime_type = $mime[ $ext[ count ( $ext ) - 1 ] ];
  
  				    header("HTTP/1.1 200 OK");
  			   	 header("Pragma: public");
 				 	 header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
 				 	 header("Cache-Control: public");
 				 	 header("Content-Description: File Transfer");
  			 
 				 header("Content-Type: $mime_type");
 			 	 header("Content-Length: $result[size]"); 			 
 				 header("Content-Disposition: attachment; filename=\"$result[file]\"");
 			 	 readfile( $file );	
  				
  				}
  			  }
  			Else
  			{
 				$content = $strError -> Announce(_download_klau);
  			}
  		}
  		Else{
  			$content = $strError -> Announce(_security);
  		}
  	}
  	Else{
  		$content = $strError -> CheckError($err);
  	}	
  
  return $content;
  }

Das komische ist, wenn ich die Datei in dem ersten CodeSchnipsel direkt mit den Arrays ersetze, klappt es, wenn ich das in der Funktion mache, kommt trotzdem noch er Weiße Bildschirm.

Komisch ist dann auch noch das der Query welcher die Downloads zählen soll bei den Downloads über 5 MB manchmal einfach um 3 höher geht, obwohl im Query ja drinne steht +1.

Weiß da jemand rat?
 
Zuletzt bearbeitet von einem Moderator:
Hi,

Wieso läßt du Content-Length nicht einfach weg? Das wird doch (glaub) ich automtisch berechnet!

gruß kevin
 
Sven Mintel hat gesagt.:
Bist du sicher, dass sich ausserhalb der php-Tags keine Zeichen befinden...nicht mal Leerzeichen/Zeilenumbrüche/etc?
Absolut :(,
da sind sonst keine Leerzeichen.

@kevkev, Die Dateigröße wird mir mit FireFox und nem Freund sonst nicht angzeigt.


Könnte event. die Session die vorher initialisiert wurde den Download zunichte machen?
 
So nu will es erstmal.
Nu is mir aufgefallen, das ich mit der Methode anscheinend keine Dateien runterladen kann die größter als 5 Mb sind :(.

Die 1 MB Datei klappt Prima, die 6 MB Datei gar nicht.
Da öffnet er das Fenster und nichts passiert. Nu muss ich da wieder nen Workaround finden, liegt warhscheinlich an dem dämlichen SafeMode aufm Webspace :(.
 
Hiho,
ich meine, du kannst einiger Header weglassen. In meinem Downloadstarter verwende ich vollgende Angaben (Nicht für Dateien über 5MB getestet):

PHP:
<?
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: public"); 
header("Content-Type: $ctype"); // $ctype ist application/pdf etc
$user_agent = strtolower ($_SERVER["HTTP_USER_AGENT"]); 
if ((is_integer (strpos($user_agent, "msie"))) && (is_integer 
(strpos($user_agent, "win")))) 
{ 
header( "Content-Disposition: filename=".basename($filename).";" ); 
} else { 
header( "Content-Disposition: attachment; 
filename=".basename($filename).";" ); 
} 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: ".filesize($dir.$filename)); 
readfile($dir.$filename);
?>

Ein weiteres Problem könnte sein, dass dein Webhoster die maxfilesize in der INI auf 5mb gesetzt hat. Frag mich aber nicht, wie die Einstellung genau heißt :rolleyes:

mfg
 
meilon hat gesagt.:
Hiho,
ich meine, du kannst einiger Header weglassen. In meinem Downloadstarter verwende ich vollgende Angaben (Nicht für Dateien über 5MB getestet):

PHP:
<?
 header("Pragma: public"); 
 header("Expires: 0"); 
 header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
 header("Cache-Control: public"); 
 header("Content-Type: $ctype"); // $ctype ist application/pdf etc
 $user_agent = strtolower ($_SERVER["HTTP_USER_AGENT"]); 
 if ((is_integer (strpos($user_agent, "msie"))) && (is_integer 
 (strpos($user_agent, "win")))) 
 { 
 header( "Content-Disposition: filename=".basename($filename).";" ); 
 } else { 
 header( "Content-Disposition: attachment; 
 filename=".basename($filename).";" ); 
 } 
 header("Content-Transfer-Encoding: binary"); 
 header("Content-Length: ".filesize($dir.$filename)); 
 readfile($dir.$filename);
 ?>

Ein weiteres Problem könnte sein, dass dein Webhoster die maxfilesize in der INI auf 5mb gesetzt hat. Frag mich aber nicht, wie die Einstellung genau heißt :rolleyes:

mfg

Moin,
ich habe das Script auf einem anderen Server getestet und da lief es perfekt, sollte mir also event. mal nen anderen Hoster suchen ^^.
 
Zurück