Avatar billede ohmish Nybegynder
12. januar 2003 - 08:00 Der er 32 kommentarer og
2 løsninger

$GET['file'] og readfile.. hvordan cacher jeg billedet?

Jeg har dette dejlige script der henter et billede fra en .htaccess-beskyttet mappe. Men billedet blir ikke automatisk cached og ska loade forfra hver gang... kan jeg ikke tvinge det op i cachen el. lign.?

<?
$mappe="ostemappe/"; 
if (isset($_GET['fil'])) { $fil=$_GET['fil'];
if (!ereg('\.\.',$fil)) { readfile($mappe.$fil); } }
print "<br><br><img src=\"visosten.php?fil=ostemad2.gif\">";
?>
Avatar billede tipsen Nybegynder
12. januar 2003 - 11:31 #1
Du kan sende nogle ekstra header med:

Disse er kopieret direkte fra http://dk.php.net/manual/en/function.header.php for at give dig en ide om dine muligheder:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Date in the past
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");  // always modified
header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Content-type: image/gif");

Jeg vil foreslå dig at bruge en passende Content-type samt en Cache-Control header - og de skal indsættes dér hvor jeg har skrevet header() i din kode. Hvad der præcis skal stå ved jeg ikke, men kig evt. på det link jeg gav.

<?
$mappe="ostemappe/"; 
if (isset($_GET['fil'])) {
  $fil=$_GET['fil'];
  if (!ereg('\.\.',$fil)) {
    header();
    readfile($mappe.$fil);
  }
}
print "<br><br><img src=\"visosten.php?fil=ostemad2.gif\">";
?>
Avatar billede erikjacobsen Ekspert
12. januar 2003 - 12:02 #2
Du skal huske din Content-type, og du skal ikke skrive HTML ud samme
med billedet.
Avatar billede ohmish Nybegynder
12. januar 2003 - 12:13 #3
erik > hva mener du.. ka jeg ikke vise et cached billede på en side med html på?
Avatar billede ohmish Nybegynder
12. januar 2003 - 12:18 #4
hva hvis filen både ka være jpeg, gif, html osv. ?
Avatar billede ohmish Nybegynder
12. januar 2003 - 12:19 #5
tipsen.. takker. jeg kigger på det (helt nyt område for mig). point falder senere :)
Avatar billede erikjacobsen Ekspert
12. januar 2003 - 12:32 #6
linien print "<br><br><img src=\"visosten.php?fil=ostemad2.gif\">";
skal væk. Det giver ingen mening

Du skal selv kigge på extension og bestemme din contenttype.

Og ja, kig på de headers, og sæt en dato ud i fremtiden. Så
bliver den måske cachet
Avatar billede ohmish Nybegynder
12. januar 2003 - 12:51 #7
hvis jeg fjerner linien vises billedet jo ikke. det var vist dig der lavede det.. og det virker da også fint bortset fra at billedet ikke blir cachet (endnu) :)
Avatar billede erikjacobsen Ekspert
12. januar 2003 - 12:57 #8
Jamen linien skal stå i din .html fil - det giver ikke
mening at blande den linie med de pixels der udgør
billedet. Du kan ikke finde et sted hvor jeg har sat de
to ting sammen på den måde :)
Avatar billede tipsen Nybegynder
12. januar 2003 - 12:57 #9
Så ret koden til:

<?
$mappe="ostemappe/"; 
if (isset($_GET['fil'])) {
  $fil=$_GET['fil'];
  if (!ereg('\.\.',$fil)) {
    //headers;
    readfile($mappe.$fil);
  }
} else {
  print "<br><br><img src=\"visosten.php?fil=ostemad2.gif\">";
}
?>
Avatar billede erikjacobsen Ekspert
12. januar 2003 - 13:03 #10
Det er formelt korrekt, tipsen. Men linien med html giver fortsat
ingen mening når scriptet udelukkende kaldes fra en

  <img src="visosten.php?....">
Avatar billede ohmish Nybegynder
12. januar 2003 - 13:09 #11
hva er det der er galt med linien? jeg er lidt lost...

jeg bruger det du skrev tidligere:

<?
  $path='/udenfor/din/web/mappe/';
  header('Content-type: image/jpeg');
  if (isset($_GET['billede'])) {
    $billede=$_GET['billede'];
    if (!ereg('\.\.',$billede)) {
      readfile($path.$billede);
    }
  }
?>

<img src="bilder.php?billede=Sjovhest.jpg">
Avatar billede tipsen Nybegynder
12. januar 2003 - 13:10 #12
Erik: Vi er enige om det er en grim løsning, men teknisk set fungerer det vel på følgende måde:

1. Filen kaldes og udskriver img-tagget
2. src i img tag kalder filen igen - denne gang med en fil-parameter
3. pga. fil-parameteren vil billedet blive sendt og indsat i den første fil
Avatar billede ohmish Nybegynder
12. januar 2003 - 13:10 #13
måske er det unødvendigt at jeg bruger både html og php i linien.. men det gør vel ik noget for selve processen?
Avatar billede tipsen Nybegynder
12. januar 2003 - 13:11 #14
ohmish: dit php-script og img-tagget - optræder de to ting i samme fil? - så er det ikke så heldigt!
Avatar billede ohmish Nybegynder
12. januar 2003 - 13:15 #15
ja det gør de. hehe. jeg har vist misforstået noget så.. Erik: du mente jeg skulle lave en seperat side (bilder.php f.eks) indeholdende scriptet:
<?
  $path='/udenfor/din/web/mappe/';
  header('Content-type: image/jpeg');
  if (isset($_GET['billede'])) {
    $billede=$_GET['billede'];
    if (!ereg('\.\.',$billede)) {
      readfile($path.$billede);
    }
  }
?>

til behandling af <img src="bilder.php?billede=Sjovhest.jpg"> ??
Avatar billede erikjacobsen Ekspert
12. januar 2003 - 15:56 #16
Ja selvfølgelig er det hvad jeg mener. Du har vel allerede en
.html (eller .php) fil med <img>-tags - det er bare navnet på
billedet du ændrer. Intet andet.
Avatar billede ohmish Nybegynder
12. januar 2003 - 22:32 #17
ok. så trængte den ind
Avatar billede erikjacobsen Ekspert
12. januar 2003 - 22:41 #18
Men er det så stadig et problem med caching?
Avatar billede ohmish Nybegynder
12. januar 2003 - 23:02 #19
ja. den ska stadig hente hele billedet.
Avatar billede ohmish Nybegynder
12. januar 2003 - 23:13 #20
NU virker det.. jeg har flyttet headeren lidt ned. Tak for hjælpen!

<?
  $mappe='filer/';
  if (isset($_GET['fil'])) {
    $fil=$_GET['fil'];
    if (!ereg('\.\.',$fil)) {
  header('Content-type: image/jpeg');
      readfile($mappe.$fil);
    }
  }
?>

Point:
Tipsen >> jeg fik aldrig brug for dit svar. de headere du skrev er til at tvinge frisk visning af filer, og ikke omvendt som jeg havde brug for. Men du hjalp da lidt.
Erik skriv os' lige et svar.
Avatar billede ohmish Nybegynder
12. januar 2003 - 23:17 #21
Erik og andre.. Se meget gerne: http://www.eksperten.dk/spm/304094 der handler om sletning af fil i .htaccess-mappe.
Avatar billede ohmish Nybegynder
12. januar 2003 - 23:39 #22
hmm.. det virker ikke hvis jeg loader en anden side en den med billedet, og går tilbage. så må jeg jo se på det der udvidede headerfis.
Avatar billede erikjacobsen Ekspert
12. januar 2003 - 23:45 #23
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Date in the past
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");  // always modified
Avatar billede erikjacobsen Ekspert
12. januar 2003 - 23:46 #24
ups - 2 secs - fik trykket for hurtigt
Avatar billede erikjacobsen Ekspert
12. januar 2003 - 23:47 #25
Du kan sætte en expires ud i fremtiden med:

header("Expires: ". gmdate("D, d M Y H:i:s",time()+60*60*24*30) . " GMT");    // Date in the future
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");  // always modified

Så den bliver cachet i 30 dage
Avatar billede ohmish Nybegynder
12. januar 2003 - 23:49 #26
alright! smid et svar.
Avatar billede erikjacobsen Ekspert
12. januar 2003 - 23:50 #27
Virker det ?? Har du prøvet ??
Avatar billede erikjacobsen Ekspert
12. januar 2003 - 23:52 #28
Det kan være du skal sætte Last-Modified til en fast gammel
dato- eller blot slette den.
Avatar billede ohmish Nybegynder
12. januar 2003 - 23:56 #29
det virker fint!! tak. men er det helt vanvittigt f.eks at skrive:

header('Content-type: image/jpeg/gif/bmp/png'); ??
Avatar billede erikjacobsen Ekspert
13. januar 2003 - 00:09 #30
ja - du skal bestemme dig til hvilken du vil sende

image/jpeg
image/gif

eller hvad det nu er (men send aldrig bmp filer)

Men, ok, det andet virker
Avatar billede ohmish Nybegynder
13. januar 2003 - 00:15 #31
Ok :)

har du tid/lyst til at forklare mig hvordan jeg gør med: http://www.eksperten.dk/spm/304094 ?
Avatar billede tipsen Nybegynder
13. januar 2003 - 10:45 #32
ohmish: Jeg er klar over, at de ikke ville fungere præcis som jeg skrev dem - det var også derfor jeg skrev:

"Disse er kopieret direkte fra http://dk.php.net/manual/en/function.header.php for at give dig en ide om dine muligheder:"

og

"Jeg vil foreslå dig at bruge en passende Content-type samt en Cache-Control header - og de skal indsættes dér hvor jeg har skrevet header() i din kode. Hvad der præcis skal stå ved jeg ikke, men kig evt. på det link jeg gav."

-der skal jo også være lidt hjemmearbejde ;-)
Avatar billede ohmish Nybegynder
13. januar 2003 - 11:41 #33
tipsen>> ålrajt, og ja seføllig. hjælp til selvhjælp kalder jeg det. jeg havde ik tid/tålmodighed til at gennemgå en lang manual efter løsningen. det har jeg nu! sidder netop og sluger www.php.net (bla. filtype-delen). Det' sgu ik fordi jeg ikke vil sætte mig ind i det, jeg gad bare ik lige der. Kender du ik når man ska bruge noget hurtig pastekode lige her og nu? q:)
Avatar billede tipsen Nybegynder
13. januar 2003 - 11:51 #34
Jeg har (heldigvis) sjældent så travlt :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester