- PR -

ファイルアップロードしたファイル名をFilter内で取得する方法について

1
投稿者投稿内容
hati
会議室デビュー日: 2007/12/06
投稿数: 6
投稿日時: 2007-12-18 22:30
<開発環境>
・Tomcat5.5
・jdk1.5.0_06
・jre1.5.0_06


<確認内容>
ファイルアップロード機能画面で、フィルタークラス内で制御を考えております。
実装方法でどなたかアドバイスを頂きたいと思います。

・フィルタークラス内での制御仕様
ファイルアップロード対象ファイルの拡張子を『CSV』とします。
それ以外のファイルに対しては後続処理を分岐する予定です。


・現状実装方法で悩んでいる箇所
フィルタークラス内でファイル名を取得する際、以下の処理の流れで実装を想定してみましたが
ファイル名の取得が出来ない状態です。

 [処理の流れ]
 1. request オブジェクトの中から InputStream オブジェクトを取り出す。
 2. boundaryの読み込み
 3. ファイル名の検出
 4. ファイルが存在した場合、拡張子を取得。

 [上記処理の流れのプログラム]

※Servletクラス内で処理する内容と同じイメージで考えたら以下になりました。
 そもそも考え方が違うのでしょうか?
 基本的なところからご教授お願いいたします。

//---- doFilter メソッド内を抜粋 --------------------------------------------
ServletInputStream in = request.getInputStream();
response.setContentType("text/html;charset=Shift_JIS");
int bufsize = 1024 * 10;
int count,k;
String boundary = null,str = null,filename = null;
String lowerStr = null;
byte[] b = new byte[bufsize];
int ss = -1,se = -1;
String strFileExtension = null;
while ((count = in.readLine(b, 0, bufsize)) != -1) {
// boundaryの取得
if ((k = request.getContentType().indexOf("boundary")) >= 0) {
// boundaryの取得
boundary = request.getContentType().substring(k + 9);
// ファイル名の検出
str = new String(b, 0, count - 2);
lowerStr = str.toLowerCase();
ss = lowerStr.indexOf("filename=");
if (ss >= 0) {
// ファイル名の最後を検出
se = lowerStr.indexOf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"", ss + 10);
if (se >= 0) {
// パスをはずしファイル名だけ切り出し、コード変換
filename = str.substring(ss + 10, se);
filename = filename.substring(filename.lastIndexOf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\") + 1);
filename = new String(filename.getBytes("8859_1"), "JISAutoDetect");

System.out.println("アップロードファイル名:"+filename);

strFileExtension = filename.substring(filename.lastIndexOf(".")+1);

System.out.println("ファイル拡張子:"+strFileExtension);

break;
}
}
}
}
chain.doFilter(request, response);

対処方法がご存知の方がおりましたら、ご教授お願いいたします。
ranco
大ベテラン
会議室デビュー日: 2007/11/02
投稿数: 112
投稿日時: 2007-12-19 14:18
基本的に、readLine()をやってる途中で中身を解析するのは間違いでは? この有名なソースをダウンロードし:
http://www.servlets.com/cos/cos-05Nov2002.zip

MultipartParser.javaのreadNextPart()メソッドを勉強してください。
そこまでたどり着くためには、フィルタのメインクラスであるMultipartFilter.javaから、-> MultipartWrapper.java -> MultipartRequest.java -> MultipartParser.javaとたどる必要があるでしょう。
補記:このメソッドでは、extractDispositionInfo()というメソッドを呼んでファイル名などを取得しています。boundaryはクラスのコンストラクタの中で事前捕捉しています。







[ メッセージ編集済み 編集者: ranco 編集日時 2007-12-19 15:57 ]
1

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