2005-08-18(木)
謎・・・
とあるシステムで、どうしてもキャッシュがクリアできない問題に悩み中。
画像やテキストデータを投稿して、テキストデータはDBに、画像ファイルはデータをDBに登録した際のIDをファイル名にしてサーバ内に保存している。で、記事を編集する際には、テキストデータをDBから呼び出してフォームに表示して、画像もサムネイル画像を表示。で、画像は縦で撮影したものを横向きのままアップした場合のために回転が出来るようにしたんだけど、それはフォーム自体のSubmitと別にボタンをつけた。ラジオボタンで「時計回りで90度」か「反時計回りで90度」を選んで、そのボタンを押すと、その場でサーバ上の画像ファイルを回転するようにした。(ちなみに回転の処理にはImageMagickを使用)
で、回転の処理後にそのフォームを再読み込みする処理も入れた。再読み込みすれば回転後の画像のサムネイルが表示される。
初めは「回転の処理が上手くいってないのか?!」と思い、サーバ内の画像ファイルを確認したら、ちゃんと回転してた。で、ページをリロードしてみたら、元の画像から180度回転したサムネイルが表示された・・・。1度目でちゃんと90度回転していたものが、リロードすることによって再度データがSubmitされて、また90度回転してるっぽい。
「こりゃ、キャッシュの仕業じゃな。」と思い、フォームのHTMLにMETAタグで”no-cache”を入れたけど、変わらず。CGIのほうから、HTTPヘッダで”no-cache”を吐き出すようにしたけど、やっぱり変わらず・・・。
いろいろ調べたら、
とりあえずは、「この画面上での表示は変わってないけど、サーバ上ではちゃんと変更されてるから、リロードしないでね」というような内容の注意書きを表示しておくことにした。(とりあえずはそれでいい、って言われたんだもーん。)
ネットでいろいろ調べてる最中に、全く同じ問題に直面している人が、どこぞのCGI質問掲示板で質問しているのを発見したけど、誰もレスしてなかった・・・。あの人は解決したんだろうか。
解決策をご存知の方がいらっしゃいましたら、ご教授くださーい!
>ひろさん
名前を変えるのが手っ取り早いってのは分かってたんですが、事情があって、あんまりいろいろいじれないんです。ファイル名も変えられないw」w」w」。
でも、コメントありがとうございました!
もう解決した??俺なんかが使うときは読み出したファイル名と保存するファイル名を変えてます。
Image Magic じゃなくGD使いですけど・・・^_^;
回転する前のファイル名と回転して保存するファイル名を一部変更して保存して、DBへは変更した画像の名前を。
こうすれば、ブラウザのキャッシュが聞かないと思います。
>Daisukeさん
レス遅くなってすみません・・・。
DBからデータ取ってきて、CGIからHTMLテンプレートにデータを渡して置き換え文字と変換してるんです。PHPで言えばSmartyみたいな感じです。
なので、img タグのsrc属性に渡しているのは「./data/xxxx.jpg」というファイル名そのものなのです。
ですが、CGIからクエリーでダミーデータを渡すことは可能だと思います。試してみます。ありがとうございました!
>Shoさん
コメントありがとうございます。レス遅れてすみません!
実は、その方法も試してみたんですがダメだったんです・・・。何をしてもキャッシュがクリアされない理由が分からずスッキリしません。(泣)
ありがとうございました!
はじめまして。
CGIに画像ファイルをopenさせて、
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
の3つをヘッダにつけてみたらいががでしょうか?
こんにちは。
かなり前に同様にはまったことがあります。
Webアプリの難しいところですよね^^
img タグのsrc属性URLにはCGIのURLが入っているというイメージですかね?
もしそうでしたら、CGIのクエリーとして実際の処理に使わないdummyのパラメータ(たとえば「dummy=現在の日時」みたいなもの)を追加してやって、毎回URLが変わるようにしてやれば回避できるかも、と思いますがいかがでしょう?
(色々制約もあるでしょうし、意図されている解決方法とかけ離れていたらごめんなさい。。。)
http://n-function.com/cgi/mt/mt-tb.cgi/290



