DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   (X)HTML, JavaScript, DHTML, XML, CSS (http://www.devprotalk.com/forumdisplay.php?f=8)
-   -   naterati browser da uradi image reload (http://www.devprotalk.com/showthread.php?t=6752)

ivanhoe 19. 11. 2008. 18:09

naterati browser da uradi image reload
 
problem je u sledecem, kad se edituje slika u profilu treba naterati browser da refreshuje cache, da se stara slika ne bi pojavljivala vise... naravno lako je dodati neki random GET parametar da bi se ucitala nova slika na toj strani, obicno sam to do sad tako radio, ali ovde je problem sto se slika koristi na celom sajtu, pa ce ostatak sajta i dalje prikazivati staru sliku...Palo mi je napamet da na edit strani saljem drugaciji header, ali to nece raditi jer browser nece ni ucitavati sliku na toj strani jer mu je vec u keshu...

Jel postoji neka strategija da se ovo resi, znaci da nateram browser da ubije cache ?

EDIT: Nixa mi je predlozio da menjam svaki put naziv (tj. putanju) slike kad se snima, sto ce mi resiti problem... Ali ajd da ostavim thread, mozda bude jos neka dobra ideja...

kodi 19. 11. 2008. 20:26

$novoIme=$userID.'-'.time().$extenzijaFajla;
tj, nixino reshenje.

to bi trebalo da radi ok sve dok je slika na fajl sistemu, ako ti je slika neki blob u bazi....
hmm.. onda probaj da saljes lastModified hedere uz heder o slici

ili da opet odradis kao da je na fajlsistemu, a da imas rewrite rule koji uhvati userID, ime se promenilo zbog novog timestampa, on onda izvuce avatar iz baze i ne bi trebalo da bude problema

:)

(mada nisam siguran koliko bi to, i da li bi to opteretilo server na high traffic sajtovima)

bluesman 19. 11. 2008. 20:30

Mozes da ucitas sliku sa <img src="url_do_slike.jpg?nesto=nesto_razlicito" /> to ce sasvim normalno da prikaze jpg

Edit: izvini, nisam pažljivo pročitao pitanje, mislio sam kako useru da prikažeš da mu je slika promenjena kada uploaduje novu, a tebi u stvari treba da svi ostali takođe vide novu sliku. To možda možeš sa .htaccess

<Directory "/path/gde/uploadujes/">
<FilesMatch "\.(jpg|png|gif)$">
Header set Cache-Control "max-age=7200, must-revalidate"
</FilesMatch>
</Directory>

kodi 19. 11. 2008. 20:43

evo jednog od komentara ispod php.net/header

Citat:

When using PHP to output an image, it won't be cached by the client so if you don't want them to download the image each time they reload the page, you will need to emulate part of the HTTP protocol.

Here's how:
Kôd:

<?php

    // Test image.
    $fn = '/test/foo.png';

    // Getting headers sent by the client.
    $headers = apache_request_headers();

    // Checking if the client is validating his cache and if it is current.
    if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == filemtime($fn))) {
        // Client's cache IS current, so we just respond '304 Not Modified'.
        header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($fn)).' GMT', true, 304);
    } else {
        // Image not cached or cache outdated, we respond '200 OK' and output the image.
        header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($fn)).' GMT', true, 200);
        header('Content-Length: '.filesize($fn));
        header('Content-Type: image/png');
        print file_get_contents($fn);
    }

?>


u principu uvek treba slati last modified kad se salje neka slika...
drugi je problem sto su 90% primera po tutorijalima na netu, a i ponekoj knjizi ovakvi:

Kôd:

<?php
$length = strlen($imagedata);
header('Content-Length: '.$length);
header('Content-Type: image/jpeg');
print($imagedata);
?>

tj nigde ni traga od header-a.


e sad, ja stvarno nisam testirao da li ce ovakav pristup definitivno naterati recimo IE6 da promeni sliku.. treba probati.

MorenoArdohain 19. 11. 2008. 20:56

Ja bih to uradio na nivou Apachea (ako je on uopste u pitanju :)

Probaj da stavis expire headere za slicice kako treba, na brzinu sam nasao primer:
http://www.websiteoptimization.com/speed/tweak/cache/

Citat:

<Directory "/home/website/public_html">
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
ExpiresDefault A300
<FilesMatch "\.html$">
Expires A86400
</FilesMatch>
<FilesMatch "\.(gif|jpg|png|js|css)$">
Expires A2592000
</FilesMatch>
</Directory>

ExpiresDefault A300 sets the default expiry time to 300 seconds after access (A). Using M300 would set the expiry time to 300 seconds after file modification. The FilesMatch segment sets the cache-control header for all .html files to 86400 seconds (1 day). The second FilesMatch section sets the cache-control header for all images, external JavaScripts and CSS files to 2592000 seconds (30 days).
Naravno, samo treba izmeniti da je expiry vrlo kratak za slicice.
Koliko ja znam, browser bi trebao da osvezi svoj cache nakon tog perioda.

bluesman 19. 11. 2008. 20:58

E, upravo sam ja editovao svoj post sa istim predlogom :)

ivanhoe 19. 11. 2008. 21:06

@blues: znam za to, spomenuh da sam obicno koristio GET kao resenje, ali to je resenje za tu stranu, a na nekoj drugoj strani ce i dalje da se vuce stara slika, jer slika.jpg i slika.jpg?nesto nisu isto u keshu.

@kodi: slike se naravo ne salju iz php, nego kao staticki fajlovi, ali cak i kad bih koristio php za to, opet postoji problem sto browser nece ni probati da ucitava tu sliku, jer su headeri namesteni za sve slike da se naravno kesiraju. Pa se ni skript nece pozvati odnosno novi header nece biti poslat.

Elem, ova fora da svaki put dodam random element u putanju kad je snimam u bazu radi skroz ok, za sad najednostavnije resenje. Nije nixa za bacanje :)

EDIT: e sad moram i ja da editujem post, bre :) Daklem, ok vam je ideja, ali onda mi se slike nece kesirati (to jest na kratko), a ne edituju se toliko cesto da bi se to isplatilo.

MorenoArdohain 19. 11. 2008. 21:11

Pa mozes implementirati taj expire header samo za slike na "after edit" strani - jer ce browser nakon toga osveziti i svoj cache (setuj expire na 0).

ivanhoe 20. 11. 2008. 01:33

hmm, moguce da ja nesto ne kapiram dobro, ali mislim da nece... jer da bi osvezio cache settings preko headera on mora da ucita taj fajl, a on ga nece ucitati jer vec ima tu sliku u keshu (ukoliko se naziv slike ne menja)..

MorenoArdohain 20. 11. 2008. 01:42

Mislim da gresis, mada mozda i ja nisam bio precizan, pogledaj ovo:
http://betterexplained.com/articles/...-http-caching/

Tu je objasnjeno u kojim slucajevima browser kesira, u zavisnosti od headera za trazeni fajl.

Edit: mozda expiry header nije dobro resenje, mogao bi da probas sa eTag ili Last Modified.
Ako te ne mrzi da se bakces sa tim :)


Vreme je GMT +2. Trenutno vreme je 23:49.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.