- PR -

ファイルをダウンロード後、サーバ側テンポラリファイルを削除する方法

1
投稿者投稿内容
チェーラ
会議室デビュー日: 2005/02/02
投稿数: 12
投稿日時: 2005-04-21 18:45
いつも拝見させて頂いています。

現在、1つのサーブレットでクライアント側からのリクエストに応じた
データをDBより引っ張ってきて、サーバ側tmp領域に一度作業ファイルを生成。
その後、クライアント側にファイル保存のダイアログを出してダウンロードして
もらった後にサーバ側tmp領域上の作業ファイルを削除する仕組みを考えているのですが、
ファイル保存のダイアログが出力する時には既にサーブレット側の処理が全て終了しているように見えます。
また、言語は異なりますが下記URLを参考にして

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=19716&forum=7

サーブレット内にfinallyブロック内でFile.delete()を記述して
最終処理にてファイルを削除するようにしたのですがファイルは削除されません。

上記の機能を一つのサーブレットでまかなうのは無理があるのでしょうか?
何かヒントがございましたらご教示お願いいたします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-04-21 19:12
作業ファイルを送信するのはサーブレット内で行っていますか?
それならば一通り送信し終わった後に最後に File.delete() で消せるはずです。消せないのであればそのファイルを書き出しているストリームがクローズされていない可能性がありますのでご確認ください。

ファイルの送信をサーブレットコンテナの Web サーバ機能にまかせているのであればセッションタイムアウトのタイミングなどで掃除してやる必要があるかと思います。
HttpSessionListener や SessionBindingListener で処理しましょう。
File.deleteOnExit() を呼び出しておいてサーバシャットダウン時に消して貰うという方法も考えられます。
#JVM がクラッシュしたら消えないかもしれませんが
チェーラ
会議室デビュー日: 2005/02/02
投稿数: 12
投稿日時: 2005-04-21 20:12
インギ様

早速のご回答ありがとうございます。

なにぶん知識が浅いもので勘違いしていたらすみません。

> 作業ファイルを送信するのはサーブレット内で行っていますか?
> それならば一通り送信し終わった後に最後に File.delete() で消せるはずです。
> 消せないのであればそのファイルを書き出しているストリームがクローズされていない
> 可能性がありますのでご確認ください。

 → 現在のつくりではダイアログが表示された時には既にサーバ側に作業ファイルが生成され、
   サーブレット側の処理が完了し、後は保存ボタンを押下されるとダウンロードが開始され、
   サーブレットの手から離れているように見えます。
   ダイアログでのアクションを待ってファイルを送信するようなことって可能でしょうか?

> ファイルの送信をサーブレットコンテナの Web サーバ機能にまかせているのであればセッションタイムアウトのタイミングなどで掃除してやる必要があるかと思います。
> HttpSessionListener や SessionBindingListener で処理しましょう。
> File.deleteOnExit() を呼び出しておいてサーバシャットダウン時に消して貰うという方法も考えられます。
> #JVM がクラッシュしたら消えないかもしれませんが

 → 仮にファイルの送信をサーブレットコンテナのWeb サーバ機能にまかせている場合は
   セッションでの処理でしか実装できないものなのでしょうか?
   
チェーラ
会議室デビュー日: 2005/02/02
投稿数: 12
投稿日時: 2005-04-21 21:25
インギさま

ありがとうございます。
ストリームのclose処理をもう一度見直したところ抜けがありました。
そこを修正し、またFinallyブロック内にてFile.delete()を記述して
実行したところ、期待通りの動きができました。

本当に助かりました。ありがとうございます。

今後もよろしくお願いいたします。
1

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