- PR -

画像ファイルをキャッシュさせない(一時ファイルを削除したい)

1
投稿者投稿内容
たま
会議室デビュー日: 2005/11/07
投稿数: 3
投稿日時: 2005-11-07 11:18
Java開発初心者です。
Java(Struts)による開発をしているのですが、アドバイスを頂きたく投稿致しました。
(機能)画面(JSP)でイメージを選択し、その画像ファイルをサーバに登録します。
(問題点)画面で画像を変更し登録した後に、変更前のイメージが表示されてしまいます。
(原因)画像ファイルがキャッシュされ、インターネット一時ファイル(Temporary Internet Files)に保存されてしまう為、そのイメージを表示してしまうのだと思います。
JSPでは、
response.setHeader("Expires", "-1");
response.setHeader("Pragma","no-cache");
response.setHeader("Cache-Control","no-cache");
や、
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META EQUIV="expires" CONTENT="0">
等の制御を記述するとページ情報はキャッシュされないのですが、画像ファイルは一時ファイルに保存されてしまいます。

IEの設定を変えず、プログラムで制御をしたいのですが、何か方法がないでしょうか?
Javaで一時ファイルを削除する方法等、教えてください。
よろしくお願い致します。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-11-07 12:07
画像ファイルは、JSPで表示されるページとは別のHTTPリクエストで取得されます。
画像ファイルの取得をどのように実装されているのかわかりませんが、「登録」されている
ファイルを直接取ってくるのであれば、当然キャッシュが使われるでしょう。なぜかというと、

引用:

response.setHeader("Expires", "-1");
response.setHeader("Pragma","no-cache");
response.setHeader("Cache-Control","no-cache");


このような設定は、JSPで表示するページに対しての指示であり、画像ファイルの取得の際には
これが使われないからです。一つの手としては、画像ファイルをサーブレットから取得する
ようにして、同様の指示をレスポンスに返すようにすることがあります。またもう一つの手と
しては、ブラウザから見て画像ファイルが同じものと認識しないようにURLに手を加えることが
あります。つまり、

image/aaa.jpg?200512050000

のように無意味な毎回変化するパラメータを画像のURLに設定しておけば、ブラウザは
キャッシュにないと判断してリクエストを投げるはずです。
たま
会議室デビュー日: 2005/11/07
投稿数: 3
投稿日時: 2005-11-07 16:59
uk様:
ご回答ありがとうございました。
画像の操作については、JSPではイメージにURLを指定して表示し、
登録時にFileクラスでサーバのフォルダ先に同ファイル名(拡張子は変わる)で保存しています。
例:JSP
<IMG name="imgFile" src='<bean:write name="FormBean" property="newImgFileName" />' />
<input name="fileLocation" type="file" class="inputFile" onchange="imgFile.src=fileLocation.value;" >
例:Java
File file = new File(newImgFileName);
file.createNewFile();
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(formFile.getFileData());
fileOutputStream.flush();

ご提示頂きました方法として、後者の方はURLにランダム変数(時刻など)を付けて
表示するようにすればうまくいきました。
ただ、イメージの操作がある画面が多く、ファイル名もDBに登録する為、保守的に難しいと思いますので最終手段にしようと思います。
(例えば、削除用画面があるのですが、修正画面でイメージを変更した後に削除画面を初めて表示しても以前のイメージで表示されてしまう為、イメージ表示がある画面は全て対応する必要があると思います。)

前者の「画像ファイルをサーブレットから取得するようにして、同様の指示をレスポンスに返すようにする」
というのは、具体的にはどのようにすればよいのでしょうか?
未熟で申し訳ありませんが、教えていただけないでしょうか。
よろしくお願い致します。


また、Javaやスクリプトなどで「Temporary Internet Files」フォルダのパスを取得する方法はないでしょうか?
VBなどではあるみたいなのですが、Javaでの実装方法が分かりません。
よろしくお願いします。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-11-07 17:25
引用:

たまさんの書き込み (2005-11-07 16:59) より:
前者の「画像ファイルをサーブレットから取得するようにして、同様の指示をレスポンスに返すようにする」
というのは、具体的にはどのようにすればよいのでしょうか?


今は、静的なロケーションを指定して画像を取得していると思います。サーブレット経由で
取得する、というのは画像ファイルを読み込んでその内容をレスポンスに出力するサーブレット
を作成し、そのサーブレットへのURLで現在の画像へのURLから置き換える、ということです。
そのサーブレットで画像ファイルの出力時にキャッシュを無効にする指示を行うようにすれば
キャッシュを読みこまないようにしてくれるでしょう。

引用:

また、Javaやスクリプトなどで「Temporary Internet Files」フォルダのパスを取得する方法はないでしょうか?
VBなどではあるみたいなのですが、Javaでの実装方法が分かりません。
よろしくお願いします。


まず、普通はクライアントの環境を直接いじるような処理はWebアプリケーションではしないし
できません。署名付アプレットなりActiveXコントロールなりを使えばできるでしょうが、それ
をするくらいであれば、画像の表示・アップロードをそのアプレットやActiveXでやったほうが
いいでしょうね。
たま
会議室デビュー日: 2005/11/07
投稿数: 3
投稿日時: 2005-11-07 17:43
uk様
ご回答ありがとうございます。
前者の方のサーブレットから取得するようなやり方を検討(実装)してみようかと思います。
アドバイスありがとうございました。
また何かありましたらよろしくお願いします。
1

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