[php] output images

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Sinds een hele tijd gebruik in mijn cms php om images te outputten omdat de directory waarin de images staat niet toegankelijk is van buiten. Alle request worden door index.php afgehandeld en intern doorgestuurd...

ik gebruik dus voor bijvoorbeeld gif bestanden...

code:
1
2
3
Header("Content-Type: image/gif");
$fn=fopen( $image,"r" );
fpassthru($fn);


Maar nu enkele klanten opeens ook Internet explorer gebruiken hebben ze last van flikkeringen. Het lijkt erop dat internet explorer het niet leuk vind dat ik op deze manier images output. Hij begint te reloaden (van de images) zodra ik erover heen ga.

Ik vraag de images op via een nette url index.php/modulenaam/action/request/image/imagenaam/ en die output dan de images die in het css bestand staan.

Als ik img tag gebruik is er niks aan de hand, maar zodra ik via css een image als background instel op een header ofzo dan gaat het flikkeren..

ik heb de hele pagina gestript, met alleen een h1 element met een background image en verder niks maar toch... als ik de image's direct opvraag (zonder php) is er niks aan de hand...

[ Voor 13% gewijzigd door Verwijderd op 13-11-2005 21:39 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Doe je toevallig een background-image swap dmv :hover oid?
In dat geval is er niets aan te doen, dat betreft gewoon een bug in IE: die download altijd background-images opnieuw bij een :hover, class-swap of als je met JS een background-image aanpast...

[ Voor 13% gewijzigd door crisp op 13-11-2005 21:47 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Cipri
  • Registratie: Januari 2001
  • Laatst online: 29-07-2024

Cipri

Of niet natuurlijk...

Via header() de datum van die files meegeven? Dan weet IE dat ze niet geupdate zijn en download ie ze niet opnieuw?

-=[ Murlocs Ate My Boots]=- Sylvanas Alliance - EU - Orosei lvl 100 Paladin


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ne, gebruik geen :hover. Het gaat zowiezo om de h1 element en input elements waar IE geen hover op support (geloof ik?)

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Dus echt een kaal document met enkel een H1 en een background-image daarop? Verder geen zaken als scripting of expressions in je CSS?

[ Voor 3% gewijzigd door crisp op 13-11-2005 21:49 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Als je gewoon de time modified van $image als header zet, bespaar je iedereen ook bandbreedte.

{signature}


Acties:
  • 0 Henk 'm!

  • TheBorg
  • Registratie: November 2002
  • Laatst online: 20-09 18:24

TheBorg

Resistance is futile.

Misschien zo:
code:
1
2
3
4
$img = imagecreatefromgif($image) or die ();
header("Content-type: image/gif");
imagegif ($img);
imagedestroy ($img);

[ Voor 14% gewijzigd door TheBorg op 13-11-2005 21:53 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Cipri schreef op zondag 13 november 2005 @ 21:45:
Via header() de datum van die files meegeven? Dan weet IE dat ze niet geupdate zijn en download ie ze niet opnieuw?
header("Content-Transfer-Encoding: binary");
header('Expires: ' . gmdate('D, d M Y H:i:s', time()+24*60*60) . ' GMT');
header("Last-Modified: Mon, 26 Jul 2001 05:00:00 GMT");

deze toegevoegd, maar werkt ook niet zo

edit: ik maak ff een test pagina en zet het online met source enzo

[ Voor 14% gewijzigd door Verwijderd op 13-11-2005 21:54 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het het probleem gevonden, zodra je een sessie start (en dat deed ik bij elke request) gaat het fout...

test code indien iemand het zelf wilt testen (noem de file test.php en in de zelfde directory een gif met de naam header.gif).... ik ga ff een oplossing zoeken en hier posten..

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?

session_start();

if(preg_match("/\.php\\/(.*)$/",$_SERVER['PHP_SELF'],$matches)) // find the variables
{
    $urls = explode('/',$matches[1]); // put them in an array...
    $type = addslashes( $urls[1] );
}

if( $type == 'image' )
{
    header("Content-Type: image/gif");
    $fn=fopen( 'header.gif',"r" );
    fpassthru($fn);
    exit();
}
elseif( $type == 'css' )
{
    header("Content-type: text/css; charset: UTF-8");
    ?>
    #menuheader {
        width: 174px;
        height: 18px;
        font-weight: bold;
        background-image: url(../../test.php/type/image);
    }
    <?
    exit();
} else
{
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>CMS</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <link rel='stylesheet' href='test.php/type/css' type='text/css'>
    </head>
<body>
<a href="#"><div id="menuheader">System</div></a>
</body>
</html>

<?

}

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
jow, session_cache_limiter('none'); toevoegen voordat je session_start(); doet fixed het probleem : )

blij dat ik ook van basis dingen als session's een eigen session handler class heb geschreven, anders had ik nu alle code kunnen uitspitten...:S

Thnx voor alle hulp people : )

EDIT: my personal opinion that Internet Explorer sucks

[ Voor 24% gewijzigd door Verwijderd op 13-11-2005 23:14 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Feit blijft dat je het probleem houdt dat dynamische images bij elke pageview opnieuw opgehaald worden, tenzij je zelf de HTTP headers checked en een 304 Not Modified terugstuurt in het geval de client aangeeft eventueel een gecachede versie te hebben (te herkennen aan de 'If-Modified-Since' en/of E-tag header).

[ Voor 136% gewijzigd door crisp op 14-11-2005 01:19 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
thnx, ik heb ook ff de volgende regels doorgevoerd om 304 header terug te geven, hoewel het voor de webapplication weinig scheelt...

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
       $filetime = gmdate( "D, d M Y H:i:s", filemtime( $directory . $file ) ). " GMT";
       
       $headers = apache_request_headers();
       $if_modified_since=preg_replace( '/;.*$/', '', $headers['If-Modified-Since'] );
       
       if ( $if_modified_since == $filetime )
       {
           header("HTTP/1.1 304 Not Modified");
           exit;
       } else {
           header("Content-Type: $ctype");
           header( "Last-Modified: " . $filetime );
           readfile( $directory . $file );
           exit;
       }

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

het scheelt jou IO en bandbreedte, en de client laadtijd :)
Overigens kan je de inhoud van de if-modified-since header direct door strtotime() halen.
Verder, als je een 304 terugstuurt, moet je alsnog ook je andere headers sturen (content-type en last-modified) - enkel geen body.

[ Voor 66% gewijzigd door crisp op 14-11-2005 10:29 ]

Intentionally left blank

Pagina: 1