Načtení otočeného obrázku v prohlížeči

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
dotTwelve
Člen | 167
+
0
-

Pomocí signálu otáčím obrázky (source i thumb), ale po provedení je na ftp všechno v pořádku, obrázky jsou otočené, ale po přesměrování $this->redirect('this'); se v prohlížeči nové nenačtou. Nové otočené obrázky se načtou až po kliknutí na refresh (F5) v samotném prohlížeči. Přikládám náhled na samotný handle (funkce rotateImage je proto, jelikož na hostingu není GD knihovna bundled).

<?php
public function handleRotate($file, $fileThumb, $angle) {
        $file = WWW_DIR . '/' . $file;
        $fileThumb = WWW_DIR . '/' . $fileThumb;

        $image = @imagecreatefromjpeg($file);
        $imageThumb = @imagecreatefromjpeg($fileThumb);
        $image = $this->rotateImage($image, $angle);
        $imageThumb = $this->rotateImage($imageThumb, $angle);
        imagejpeg($image, $file, 100);
        imagejpeg($imageThumb, $fileThumb, 100);
        imagedestroy($image);
        imagedestroy($imageThumb);
        $this->flashMessage("Fotografie byla otočena.", 'info');
        $this->redirect('this');
    }
?>

Asi bude problém s cache v prohlížeči.

Ani
Člen | 226
+
0
-

To by mělo jít ošetřit přes javascript window.location.reload(true), nebo si tam přidávat timestamp jako parametr.

iguana007
Člen | 970
+
0
-

přesně … tam kde voláš ten obrázek v HTML stačí přidat otazník a za něj timestamp, to by ti mělo zaručit, že si prohlížeč natáhne nový obrázek, protože mu jméno nebude sedět. Možná nejlíp timestamp chvíle, kdy byl obrázek otočen, aby se do cache přeci jen uložil, ale ten správný a otočený. Případně upravit hlavičky, to by imho mohlo taky pomoci.

Editoval iguana007 (17. 6. 2010 0:24)

dotTwelve
Člen | 167
+
0
-

Takze nemam presmerovavat redirectem, ale mam si napriklad do sablony po provedeni handlu hodit promennou, ktera kdyz bude tak zavola javascriptovou funkci refresh()?
Radsi bych to resil poslanim hlavicky no-cache, ale nevim jak na to, kdyz to chci pouze u tohoto handlu v presenteru.

Toto funguje, ale neni to prasarna? Neda se to napsat lepe?

<?php
public function actionEdit($id = 0) {
        header("Cache-Control: no-store, no-cache, must-revalidate");
        header("Cache-Control: post-check=0, pre-check=0", false);
        header("Pragma: no-cache");
...
}
?>

Editoval dotTwelve (17. 6. 2010 10:05)

na1k
Člen | 288
+
0
-

Tohle ti ale zakáže cache pro celou stránku a to by mohla být škoda. Ikdyž pokud by jsi to měl jen na té jedné „otáčecí“ stránce, asi by se to dalo překousnout.

Přidáním timestampu do cesty obrázku (/gfx/obrazek.png?t=1234567) omezíš to vypnutí cache jen na obrázek. Z pohledu prohlížeče bude při každém načtení jiná hodnota času, a tím to bude brát jako dva různé obrázky.

Ideální by ale bylo, kdyby jsi mohl rozlišit mezi otočeným a neotočeným obrázkem, a timestamp nahradit nějakým příznakem otočení. Fungovalo by to následovně – dokud by šel požadavek na obrazek.png?otoceny=0, prohlížeč by si ho mohl držet v cache; pak by šlo volání otáčecí funkce a adresa by se změnila na obrazek.png?otoceny=1, což by přinutilo prohlížeč natáhnout novou verzi, ale tu by pak mohl opět cachovat. To ale záleží na tom, jakou máš strukturu stránky a jestli se ti vyplatí zjišťovat otočenost anebo jsou obrázky tak malé, že raději oželíš jejich cachování.

Editoval na1k (17. 6. 2010 10:39)

dotTwelve
Člen | 167
+
0
-

Tak nakonec jsem si udelal helper:

<?php
public static function timestamp($value) {
        return $value . '?' . time();
    }
?>

kterej volam, kdyz chci aby se obrazek nekesoval. Takova holt nekesovaci verze natvrdo…