- PR -

JSPでアップロードしたファイルの削除について

1
投稿者投稿内容
totto
会議室デビュー日: 2005/04/20
投稿数: 13
投稿日時: 2005-04-20 03:34
初歩的な質問かもしれませんが、どうかお付き合いください。

イメージをサーバー側にアップロードし、そのイメージサイズが640*480以上であれば、サイズを縮小してから保存しようと思もってるのですが、
MULTIPART/FORM-DATAで送信したファイルをRandomAccessFileでサーバに保存し、ImageReaderで保存したイメージを読み込み、サイズを取得し、縮小してから同名で保存すると、縮小する前と後のイメージサイズはきちんと縮小されているのですが、ファイルサイズが縮小する前と後と同じになってしまいます。
別名で保存するときちんと、ファイルサイズも小さくなることがわかりましたので、
縮小イメージを別名で保存した後、元のイメージファイルを削除する方針に変えようと、思ったんですが、どうやら、Tomcatを終了させないと、手動でもそのファイルを
消すことができないようです・・・。
どうしたら、ファイルを消すことができるんでしょうか?
ちなみに、
イメージを縮小したり、保存したりするGraphicクラス、と
自作のFileUploaderクラス
を同ページにBeanとして使用し、scope属性をpageにしています。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-04-20 10:09
ファイル出力のストリームをクローズしていないのではないでしょうか。Windows などはファイルのロック制御がキビシイのでどこかのプロセスがファイルハンドラを握っていると消せなかったりします。
totto
会議室デビュー日: 2005/04/20
投稿数: 13
投稿日時: 2005-04-20 11:13
インギさん、返信ありがとうございます。

私の場合、ファイル出力を行っているのは、FORMからMULTIPARTで送られてきたデータを
保存するメソッドと、画像を保存するメソッドの二箇所なんですが、きちんとストリームを閉じてると思うんですが、

データ保存部
try{
  RandomAccessFile file=new RandomAccessFile(strSavePath,"rw");
file.write(bytes,0,bytes.length-2);
file.close();
}catch(Exception e){
e.getStackTrace();
}

画像保存部
public void writeImage(BufferedImage image, String fileName) {
Iterator writers = ImageIO.getImageWritersByFormatName(fileNameの拡張子);

  if (writers.hasNext() && image != null) {
ImageWriter writer = (ImageWriter)writers.next();
    try {
ImageOutputStream stream = ImageIO.createImageOutputStream(new File(fileName));
writer.setOutput(stream);
writer.write(image);
stream.close();
writer.dispose();
return;
} catch (IOException ex) {
ex.printStackTrace();
}
}
}


「他のプログラムがこのファイルを使用中です」と警告されるので、おそらくどこかに
開放し切れてない部分があるのかと思うのですが、どのプロセスがファイルハンドラを握ってるとかはわからないのでしょうか?
totto
会議室デビュー日: 2005/04/20
投稿数: 13
投稿日時: 2005-04-22 14:49
解決いたしました。

画像のヘッダ部を読み込むためにImageReaderクラスを使用しているのですが
ImageInputStreamからreaderを生成するときに、ストリームをクローズすると、
も開放されてしまうためクローズしていなかったのが原因のようです。

ImageReader reader;

ImageInputStream stream = ImageIO.createImageInputStream(new File(filename));
reader.setInput(stream);
stream.close();
ここで、ストリームを閉じるとせっかくreaderに入れた値がnullになってしまうので
readerからの情報、画像の大きさとか、枚数などを格納した後で、クローズすることで
とりあえずは、ファイルの削除ができるようになりました。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-04-22 15:30
もう解決したっぽいですが、どのプロセスがどのファイルを握っているかは、Process Explorer で見られたような気がします。
http://sysinternals.com/ntw2k/freeware/procexp.shtml
http://support.microsoft.com/kb/q232830/
1

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