- PR -

【fileupload】ブラウザで画像ファイルが更新されない

投稿者投稿内容
ogeretyou
会議室デビュー日: 2004/06/14
投稿数: 18
投稿日時: 2005-07-22 00:45
fileuploadについて困っています。

現象については下記です。

fileuploadする機能のwebアプリにおいて、

1.ブラウザから画像ファイル(jpg, gif)をアップロードする
(URLでアクセスできるPATH … %WEBAPP%\data\photo\hogehoge.gif)
ex. http://hostname/WEBAPP/data/photo/hogehoge.gif でアクセス可能

2.[http://hostname/WEBAPP/data/photo/hogehoge.gif]でアクセスし、画像ファイルを確認

3.再度アプリからfileuploadする(アプリで配置する際、"1"でuploadした際と同じディレクトリ&ファイル名で上書き)

4.[http://hostname/WEBAPP/data/photo/hogehoge.gif]でアクセスし、画像ファイルを確認
  →問題:「2」の画像と同じ(「3」で更新したファイルに更新されない)


上記問題は、ブラウザの「再読み込み」をクリックすると反映されます。
既存ファイルをdeleteしてからuploadしてもだめでした。
また、fileuploadする際のファイル名を[yyyymmddhhmmss+hogehoge.gif]のように
既存のファイル名と毎回異なるようにすると、「再読み込み」なしで更新されます。

おそらく初回の[http://hostname/WEBAPP/data/photo/hogehoge.gif]へのアクセスの際に、
キャッシュしてしまい、ファイル名が変更されていない場合、このキャッシュされた画像が
表示されてしまうものと思われます。




ファイル名には["固定" + 拡張子](ex. userId + ".gif")のようなものを想定しており、
できればこのルールの変更はしたくありません。

ブラウザに依存する問題かもしれませんが、アプリ側の対応により、
毎回更新できるような方法はありますでしょうか?
尚、ブラウザはIE6.0を使用しています。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-07-22 01:23
どんなWEB/APサーバを使用しているのかわかりませんが、
キャッシュの無効化をレスポンスヘッダで指示すればいいと思います。
ogeretyou
会議室デビュー日: 2004/06/14
投稿数: 18
投稿日時: 2005-07-24 16:31
かつのりさん、レスどうもありがとうございます。

その後、キャッシュの無効化方法について次の2つの方法を試してみたのですが、
キャッシュされた情報が読み込まれてしまいました。


//JavaServlet側で無効化指定
↓↓↓(下記3行をservletに追記)
HttpServletResponse#setHeader("Pragma", "no-cache");
HttpServletResponse#setHeader("Cache-Control", "no-cache");
HttpServletResponse#setDateHeader("Expires", 0);

上記でだめだったので、下記も指定

//HTML側(JSP)で無効化指定
↓↓↓(下記3行を追記)
<META http-equiv="Pragma" content="no-cache">
<META http-equiv="Cache-Control" content="no-cache">
<META http-equiv="Expires" content="0">


尚、下記構成により実験しています。

WWW:Apache2
AP:Tomcat5
ブラウザ:IE6


また、Mac+Firefoxにてアクセスした場合は、
上記によりキャッシュされず正常動作しています。



IEでは上記による指定でキャッシュ無効化ができない、ということはありますでしょうか。
ogeretyou
会議室デビュー日: 2004/06/14
投稿数: 18
投稿日時: 2005-07-24 16:46
追記ですが、

Mac+IE5.02
でもやはりキャッシュを読み込んでしまいます。

IEでキャッシュを読み込んでしまう問題は、
IE5で確認されていて、上記の対応では"うまくいかない"という情報が
あちこちに書かれていましたが、

IE6では、
レスポンスヘッダに

HTMLのMetaタグか、SevletのHttpServletResponseで

("Pragma", "no-cache")
("Cache-Control", "no-cache")
("Expires", 0)

次の3つを設定すればよい、と思い試したがうまくいかない、
という状況です。
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2005-07-25 09:32
ogeretyouさんがJSPやServletで画像ファイルを出力しているならば
方法として合っていますが
HTMLテキストに対して設定しているのであれば、
その中で表現している画像ファイルにはヘッダは追加されないので
その方法ですとうまくいかないです。

そこでWEB/APサーバ側でそのファイルに対して、
ヘッダを追加するような処理が必要になってきます。
かつのりさんのコメントもその当たりを指していたのだと思います。

Apache2側の場合ですとここを参考になると思います。
Tomcat側ですとここが参考になるのではないでしょうか。


[ メッセージ編集済み 編集者: いっきゅう 編集日時 2005-07-25 09:33 ]
ogeretyou
会議室デビュー日: 2004/06/14
投稿数: 18
投稿日時: 2005-07-26 23:53
>いっきゅうさん

返信どうもありがとうございます。

しかし、アドバイス頂いたうち、
ATomcat側での対応(ServletFilterによる実装)でもダメでした。

画像ファイルの出力方法については、
・Servletの戻りで出力
ではなく、
・HTMLで画像Pathを生成
しているため、

「その中で表現している画像ファイルにはヘッダは追加されない」

ということ、になってしまっているのだと思い、

アドバイスを頂いたサイトを参考に[ServletFilter]にて、

"Pragma", "no-cache"
"Cache-Control", "no-cache"
"Expires", 0

をHttpServletResponseに設定するようにしてみました。

eclipseのデバッグにて、アクセスするたびに Filter に処理が移っているのは
確認できたのですが、表示される画面は更新されていませんでした。



色々他も参考してみましたが、
どのサイトでもこの方法でうまくいくような感じなのですが、
自分の環境では何故か解決できません…


今度は、Apacheのmoduleの方も試してみようと思います。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-07-27 01:29
ウェブサーバがいくら正しい手段にて「キャッシュを行わない」
という指示をレスポンスヘッダで送信しても、
ブラウザの実装次第でどうにでもなってしまうのが痛いですよね。

禁じ手かもしれませんが、
<img src="hoge.jpg">
を、
<img src="hoge.jpg?151232312">
と、システム時間などの重複しない文字列を
URLのクエリストリングに付加するって言うのはどうでしょうか。

これならキャッシュはクエリストリング込みで行われるので、
毎回新しいのを読みに行くはず。。。

もしかしたら、
<img src="hoge.jpg?">
だけでもキャッシュを行わない可能性もありますが・・・
この辺は試していないのでわかりません。
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2005-07-27 11:22
> ウェブサーバがいくら正しい手段にて「キャッシュを行わない」
> という指示をレスポンスヘッダで送信しても、
> ブラウザの実装次第でどうにでもなってしまうのが痛いですよね。
ああ、確かにそういうのがありました。

> <img src="hoge.jpg?151232312">
> と、システム時間などの重複しない文字列を
> URLのクエリストリングに付加するって言うのはどうでしょうか
なるほど、確かにこれでも回避できますね。

しかし、ブラウザにキャッシュが溜まるのは回避できないので
サーブレットで返すように実装した記憶が過去にあります。
<img src="/ImageServlet?hoge.jpg">
このサーブレット中でキャッシュ無効化しておくと
ブラウザでキャッシュされていなかった記憶があります。

最近は確認してないので試して見てください。

スキルアップ/キャリアアップ(JOB@IT)