[PHP]Html afbeeldingen via fpassthru niet zichtbaar

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Tja, een lastige titel, maar ik heb een probleem. Op Firefox heb ik er geen last van, en helaas IE én Safari wel. Het ligt volgens mij (dus) aan het php script wat een afbeelding serveert die in een html pagina wordt opgenomen. Voorbeeldje:
HTML: index.html
1
<img src="plaatje.php">
PHP: plaatje.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$location = $config->root.$config->directory_media."storage/".$location;
if(file_exists($location)){
    ob_clean(); //Voor de zekerheid
    $fp = fopen($location, "rb");
    header("Content-Type: ".$mime);
    header("Content-Length: ".$size);
    if($url[2]=="download"){
        //Of download in de url array voorkomt
        header("Content-Disposition: attachment; filename=\"".$name."\"");
    }else{
        header("Content-Disposition: inline; filename=\"".$name."\"");
    }
    header("Content-Transfer-Encoding: binary\n");
    fpassthru($fp);
    exit;
}else{
    //File doesn't exist
    $this->display .= "Het bestand bestaat niet!";
}
Het probleem is dat dus het plaatje gewoon niet zichtbaar is. Zie voor een voorbeeld een artikeltje op mijn ubuntu blog.

Het zou misschien aan de Content-Disposition header kunnen liggen die standaard op inline staat dacht ik. Die regels weggehaald, maar het haalt niets uit. Misschien dat het nog kan zitten in de headers die je meekrijgt bij het opvragen van het plaatje:
code:
1
2
3
4
5
6
7
8
9
10
11
12
HTTP/1.1 200 OK
Date: Mon, 26 Mar 2007 16:58:04 GMT
Server: Apache/2.0.59 (Unix)
X-Powered-By: PHP/4.3.11
Set-Cookie: PHPSESSID=*knip*; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length:
Content-Transfer-Encoding: binary
Connection: close
Content-Type:
Gevonden via dit online tooltje: http://tools.devshed.com/webmaster-tools/fetch-header/

Maar de header informatie van Firefox mist de (involledige) Content-Length en Content-Close. De Connection staat daarbij op Keep-Alive en is een Keep-Alive met timeout=5,max=100 toegevoegd.

Kan iemand helpen om dit probleem op te lossen: hoe kan ik normaal via php een afbeelding serveren om die in een html pagina op te nemen?

Acties:
  • 0 Henk 'm!

  • Joolee
  • Registratie: Juni 2005
  • Niet online
Ik weet niet wat er precies de bedoeling is maar je kunt ook simpelweg het volgende gebruiken.
PHP:
1
echo file_get_contents($fp);

Eventuele headers zoals 'Content-Disposition:' kun er erboven nog instellen.

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Mm, tja, is dat niet wat overbodig om de inhoud van een bestand te lezen, die in een string te proppen en vervolgens te echo'en?

Ik had eerst ook readfile, weet niet of het heel veel uitmaakt. Maar ik had het gedaan "voor de toekomst": als ik straks grote bestanden wil downloaden kan ik met fpassthru volgens mij een buffer vormen die stukje bij beetje wat output.

Maar daarnaast heb je ook nog eens readfile, is dat dan weer beter / slechter :? Ik vind het namelijk wel vreemd: Firefox kan er mee overweg, maar Safari en Internet Explorer niet :s

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

ik zie $mime en $size ook nergens gevuld worden...

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 21-09 10:10

WormLord

Devver

En heb je al eens geprobeerd om plaatje.php direct in de browser te openen, en niet via een img-tag? Misschien dat je dan een php-error te zien krijgt.

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Ok jongens, een klein kickje om mijn eigen stomheid te vertellen :p Firefox doet niet zo moeilijk over headers, die andere browsers wel. Wat crisp zei wist ik al, omdat ik geen mime/type detectie had ingebouwd bleef dat veld in de database leeg. Geen probleem toch, Firefox werkt?

Na het veld (handmatig in de database) ingevuld te hebben werkt het wel gewoon goed. Sorry |:(
Pagina: 1