.jpg download via Header

max

Erfahrenes Mitglied
Ich habe ein Downloadskript geschrieben mit dem ich Bilder (zB. jpg) direkt downloaden kann).

PHP:
 	header("Content-Type: application/octet-stream");
 	header("Content-Disposition: attachment; filename=$file");
 	header("Content-Length: ".filesize($ordner.$file)); 
 	header("Pragma: no-cache");
 	header("Expires: 0"); 
 	readfile($ordner.$file);

Das ganze funktioniert auch wunderbar, bis auf dass wenn ich ein Bild downloade kann es das Windowseigene Bildvorschauprogramm nicht öffnen (mit Photoshop ist es kein problem), außerdem fehlen noch sämtliche Dateiinformationen wie höhe, breite, usw.

Das Bild wurde beim Upload nicht beschädigt.

Liegt das an der Client-Konfiguration oder liegts am PHP?

mfg
max
 
Hi...

Ich habe das selbe Problem... Und ja es entspricht die reale Größe der Datei... Man kann auch kein anderes programm außer Photoshop nutzen um diese Datei zu öffnen, selbst dort gibt er erst noch eine Meldung aus das die Datei evtl. beschädigt ist.

Hier mal mein Script was ich habe:

PHP:
<?php
$mimetypes = array(      
'bmp'        => 'image/bmp',      
'gif'        => 'image/gif',      
'ief'        => 'image/ief',     
 'jpeg'        => 'image/jpeg',      
'jpg'        => 'image/jpeg',      
'jpe'        => 'image/jpeg',     
 'png'        => 'image/png'  );    

$imgID = $_GET['ID'];    

$picdownq = mysql_query("SELECT id, uid, bildname, format, savename, public FROM tblbilder WHERE savename = '" . $imgID . "'") or die("Kann diese Datei nicht finden!");
$picdownr = mysql_fetch_assoc($picdownq);    

$basedir = "pixis/" . $picdownr['uid'] . "/";    

$filename = $picdownr['savename'] . "." . $picdownr['format'];  

$file = $basedir . $filename;    

$name = $picdownr['bildname'] . "." . $picdownr['format'];    

header("Content-type: " . $mimetypes[$picdownr['format']]);  
header("Content-Length: " . filesize($file));  
header("Content-Disposition: attachment; filename=" . $name);  

readfile($file);  
?>

Woran liegt es das die Datei nicht richtig Runtergeladen wird Was ist falsch an diesem Script? Ich brauch dringend eure Hilfe...

Besten Dank schonmal im Vorraus...
 
Bei mir hat die Datei auch die gleiche größe wie auf dem Server.

Ich hab das Bild jetzt versucht mit Fireworks aufzumachen, aber da bekomme ich die Fehlermeldung dass er diesen Dateityp nicht kennt.

Muss ich vielleicht noch irgendwelche informationen beim Download-Header mitsenden?
Muss die Datei auf dem Server spezielle Rechte haben?
 
Zuletzt bearbeitet:
So jetzt gehts.

Ich hab jetzt das ganze anders gemacht:
PHP:
 <?php
 $file = $_GET["f"];
 if (is_file($file)) {
 	//info über file sammeln
 	$len = filesize($file);
 	$filename = basename($file);
 	$file_extension = strtolower(substr(strrchr($filename, "."), 1));
 
 	//content type entsprechend der ext definieren
 	switch($file_extension) {
 		case "pdf": $ctype="application/pdf"; break;
 		case "exe": $ctype="application/octet-stream"; break;
 		case "zip": $ctype="application/zip"; break;
 		case "doc": $ctype="application/msword"; break;
 		case "xls": $ctype="application/vnd.ms-excel"; break;
 		case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
 		case "gif": $ctype="image/gif"; break;
 		case "png": $ctype="image/png"; break;
 		case "jpeg":
 		case "jpg": $ctype="image/jpg"; break;
 		case "mp3": $ctype="audio/mpeg"; break;
 		case "wav": $ctype="audio/x-wav"; break;
 		case "mpeg":
 		case "mpg":
 		case "mpe": $ctype="video/mpeg"; break;
 		case "mov": $ctype="video/quicktime"; break;
 		case "avi": $ctype="video/x-msvideo"; break;
 
 		//folgendes ist für dateien die nicht downgeloadet werden dürfen
 		case "inc":
 		case "sql":
 		case "asp":
 		case "cgi":
 		case "htaccess":
 		case "php":
 		case "php3":
 		case "php4": exit;
 		
 		default: $ctype="application/force-download";
 	}
 
 	//header beginn
 	header("Pragma: public");
 	header("Expires: 0");
 	header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
 	header("Cache-Control: public");
 	header("Content-Description: File Transfer");
 	
 	//den switch-erstellten ctype verwenden
 	header("Content-Type: $ctype");
 
 	//download starten
 	$header="Content-Disposition: attachment; filename=".$filename.";";
 	header($header);
 	header("Content-Transfer-Encoding: binary");
 	header("Content-Length: ".$len);
 	@readfile($file);
 	exit;
 } else {
 	exit;
 }
 ?>
 
Saubere Arbeit, nur bei mir gehts noch nicht :(

Naja was solls hab ich wohl Pech... Vielleicht liegts ja nur daran das ich das hier alles auf meinem Localrechner versuche...
 
Zurück