- - PR -
ファイルアップロードしたファイル名をFilter内で取得する方法について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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); 対処方法がご存知の方がおりましたら、ご教授お願いいたします。 |
|
投稿日時: 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