php File sendet Bild an Browser

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

php File sendet Bild an Browser

Beitrag von mgutt »

Ich habe eine download.php, die die Bilder aus der Datenbank ausliest und das entsprechende Bild dann darstellt.

Es funktioniert soweit auch alles. Das Bild wird eigentlich immer erfolgreich dargestellt.

Aber bei ca. jedem 10. Mal bekomme ich eine Blank Seite.

Auch wenn ich error reporting aktiviere kommt keine Fehlermeldung. Ich kann auch keinen Fehler mehr finden. Laut php Manual kann ich auch keinen Fehler finden.

Code: Alles auswählen

<?php 

// 
// Get general information 
// 
include('config.php'); 


// ------------------------------------ 
// Check the request 
// ------------------------------------ 
if( isset($HTTP_GET_VARS['id']) ) 
{ 
   $id = intval($HTTP_GET_VARS['id']); 
} 
else if( isset($HTTP_POST_VARS['id']) ) 
{ 
   $id = intval($HTTP_POST_VARS['id']); 
} 
else 
{ 
   die('No pic specified'); 
} 


// ------------------------------------ 
// Get this pic info
// ------------------------------------ 
$sql = "SELECT * FROM ". PIC_TABLE ." WHERE id = $id";
$query = mysql_query($sql);
$ds = mysql_fetch_object($query);
$id = $ds->id;
$pic_extension = htmlentities($ds->extension);
$pic_filename = htmlentities($ds->filename);
$pic_upname = htmlentities($ds->upname);

// ------------------------------------ 
// Increase view counter and viewtime
// ------------------------------------

$viewtime = date('YmdHis');

$sql = "UPDATE ". PIC_TABLE ." SET views = views + 1, uptime = uptime, viewtime = NOW() WHERE id = $id"; 
$query = mysql_query($sql);
if ( empty($query) )
	{
		die("Error" . "Message: Could not get database results <br> at File: " . __FILE__ . " on line: " . __LINE__);
	}

// ------------------------------------ 
// Okay, now we can send image to the browser 
// ------------------------------------ 

// Send out the Headers
header('Pragma: public');

switch( $pic_extension ) 
{ 
   case '.png': 
      header('Content-type: image/png name="' . $pic_upname . '"'); 
      break; 

   case '.gif': 
      header('Content-type: image/gif name="' . $pic_upname . '"'); 
      break; 

   case '.jpg': 
      header('Content-type: image/jpeg name="' . $pic_upname . '"'); 
      break; 

   default: 
      die('The filename data in the DB was corrupted'); 
} 


header('Content-Disposition: inline; filename="' . $pic_upname . '"');

$read_filename = $path . $pic_filename;

$pic_filesize = @filesize($read_filename);

if ($pic_filesize)
{
	header("Content-length: $pic_filesize");
}

readfile($path . $pic_filename);

?> 
liegt es vielleicht doch am Browser?
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Dennis63
Ehemaliges Teammitglied
Beiträge: 2597
Registriert: 02.07.2003 18:46

Beitrag von Dennis63 »

Ist das nur im Browser des Herstellers "Microsoft" so, oder auch in anderen?

Bei erstem ist es ein BUG im Internet Explorer. Der Bug tritt nicht auf, wenn die Dateiendung richtig ist. Also für ein Jpeg-Bild .jpeg statt .php nehmen. (Siehe ModRewrite)

Grüße
Dennis
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

ja ist nur beim IE, sorry, hatte ich vergessen dabei zu schreiben.

bei alten Versionen eigentlich immer und bei neueren per Zufall.

Ist das diese Änderung:
Wollen Sie den Benutzer auffordern, die von Ihnen gesendeten Daten wie z.B. eine generierte PDF Datei zu speichern, können Sie den Header Content-Disposition verwenden, um einen empfohlenen Dateinamen anzubieten und den Browser zu zwingen, den Dialog zum Speichern anzuzeigen.


<?php
// Wir werden eine PDF Datei ausgeben
header("Content-type: application/pdf");

// Es wird downloaded.pdf benannt
header("Content-Disposition: attachment; filename=downloaded.pdf");

// Die originale PDF Datei heißt original.pdf
readfile('original.pdf');
?>


Anmerkung: Der Microsoft Internet Explorer 4.01 hat einen Bug, der diese Funktionalität verhindert, und es gibt keinen Workaround. Auch in Microsoft Internet Explorer 5.5 existiert ein Bug, der dies behindert, dieser kann jedoch mittels einem Upgrade auf Service Pack 2 oder neuer behoben werden.
Mir ist nämlich aufgefallen, dass der Fehler nicht mehr auftaucht, wenn ich die Zeilen so ändere:

Code: Alles auswählen

header('Content-Disposition: inline; filename="' . $pic_upname . '"');

/*
$picfilesize = @filesize($path . $pic_filename);

header("Content-Length: ".$picfilesize);
*/

@readfile($path . $pic_filename);
Das betrifft aber wie man sieht nicht die Disposition, sondern den Length-Wert.
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Dennis63
Ehemaliges Teammitglied
Beiträge: 2597
Registriert: 02.07.2003 18:46

Beitrag von Dennis63 »

Wie gesagt, der Internetexplorer hat in allen Versionen BUGs, was die HEADER() Funktionen angeht.
Es kann bei Dir gehen, bei einem identischen Testsystem geht es nicht.

Daher in solchen Fällen zusätzlich dafür sorgen, daß die "echte Dateiendung" die der Browser bekommt, richtig ist.

Grüße
Dennis
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

Ok, habe es jetzt so gelöst:

.htaccess:

Code: Alles auswählen

RewriteEngine on
RewriteCond %{REQUEST_URI} ^/(.*)_large_([0-9]*).*
RewriteRule ^(.*) /download.php?id=%2  [L]
Der Dateiname sieht dann so aus:

bildname_large_12345.jpg (.gif, etc.)

Sieht jetzt gut aus.

Leider schreibt er mir natürlich alle Bilder um, die zufällig "large_12345." im Dateinamen haben. Ich wüsste nicht wie ich das nur auf den Root reduzieren könnte. Diese Problem würde aber nur auftauchen, wenn jemand zufällig ein Bild hochlädt was so aufgebaut ist und auch nur dann bei dem Vorschaubild.

Jetzt muss ich nur den fremdzugriff bzw. den direktzugriff verbieten. Das Bild soll ja nur beim includen dargestellt werden. :wink:
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

also sobald ich die zeilen wieder verfügbar mache, bekomme ich whitescreens im ie:

Code: Alles auswählen

$picfilesize = @filesize($path . $pic_filename); 

header("Content-Length: ".$picfilesize)
was hat der ie, denn mit dem content-length?
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Antworten

Zurück zu „Coding & Technik“