001    /*
002     * Copyright (c) 2009 The openGion Project.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013     * either express or implied. See the License for the specific language
014     * governing permissions and limitations under the License.
015     */
016    package org.opengion.hayabusa.servlet;
017    
018    import org.opengion.hayabusa.common.HybsSystem;
019    import org.opengion.hayabusa.servlet.multipart.MultipartParser;
020    import org.opengion.hayabusa.servlet.multipart.Part;
021    import org.opengion.hayabusa.servlet.multipart.FilePart;
022    import org.opengion.hayabusa.servlet.multipart.ParamPart;
023    // import org.opengion.fukurou.util.ZipArchive;                         // 5.7.1.2 (2013/12/20) zip 対å¿?
024    
025    import java.io.File;
026    import java.io.IOException;
027    import java.util.Map;
028    // import java.util.HashMap;
029    import java.util.TreeMap;
030    import java.util.List;
031    import java.util.ArrayList;
032    import java.util.Set;
033    import java.util.Random ;
034    import java.util.concurrent.atomic.AtomicInteger;       // 5.5.2.6 (2012/05/25) findbugs対å¿?
035    import javax.servlet.http.HttpServletRequest;
036    
037    /**
038     * ファイルをサーバã?にアãƒ??ロードするå?合に使用されるã?ルチパートå?ç�?‚µーブレãƒ?ƒˆですã?
039     *
040     * 通常のファイルアãƒ??ロード時の、form で使用する、enctype="multipart/form-data"
041     * を指定したå?合ã?、他ã?リクエスト情報もã?取り出すことが可能ですã?
042     *
043     * ファイルをアãƒ??ロード後に、指定ã?ファイル名に変更する機è?がありますã?
044     * file 登録ãƒ?‚¤アログでæŒ?®šしã�?name にã€?_NEW" とã�?�†名称を付けたリクエストå?ã‚?
045     * ファイルのアãƒ??ロードと同時に送信することで、この名前にファイルを付け替えますã?
046     * またã?アãƒ??ロード後ã?ファイル名ã?、name æŒ?®šã?名称で、取りå?せますã?
047     * クライアントから登録したオリジナルのファイル名ã?、name にã€?_ORG" とã�?�†名称
048     * で取り出すことが可能ですã?
049     *
050     * maxPostSize : æœ?¤§転送サイズ(Byte)を指定しますã? 0,またã?マイナスで無制限ですã?
051     * useBackup   : ファイルアãƒ??ロード時に、すでに同名のファイルが存在した場合にã€?
052     *               バックアãƒ??処ç�?renameTo)するかどã�?�‹[true/false]を指定しまã�?初期値:false)
053     *
054     * ファイルアãƒ??ロード時に、アãƒ??ロードå?に、同名ã?ファイルが存在した場合ã?、既存機è?は、そのまま
055     * 置き換えてã�?�¾したがã?簡易バージョンアãƒ??機è?として、useBackup="true" を指定すると、既存ã?ファイルã‚?
056     * リネã?ãƒ?�—て、バãƒ?‚¯アãƒ??ファイルを作æ?しますã?
057     * バックアãƒ??ファイルは、アãƒ??ロードフォルãƒ?‚’基準として、_backup/ファイルå�?拡張子_処ç�?™‚刻のlong値.拡張å­?になりますã?
058     * オリジナルのファイル名(拡張子付)を残したままã€?_処ç�?™‚刻のlong値" を追åŠ?�—、さらに、オリジナルの拡張子を追åŠ?�—ますã?
059     * バックアãƒ??ファイルの形式ã?æŒ?®šできませんã€?
060     *
061     * @og.group そã?他機è?
062     *
063     * @version  4.0
064     * @author       Kazuhiko Hasegawa
065     * @since    JDK5.0,
066     */
067    public final class MultipartRequest {
068    //      private static volatile int dumyNewFileCnt = 1 ;        // 3.8.1.4 (2006/03/17)
069            private static AtomicInteger dumyNewFileCnt = new AtomicInteger(1);             // 5.5.2.6 (2012/05/25) findbugs対å¿?
070    
071            private static String RANDOM_KEY = new Random().nextInt( Integer.MAX_VALUE ) + "_" ;            // 5.6.5.3 (2013/06/28) アãƒ??ロード時のãƒ?ƒŸーファイル名をもう少しã�?�‘ランãƒ?ƒ にするã€?
072    
073    //      private final Map<String,List<String>> parameters   = new HashMap<String,List<String>>();
074    //      private final Map<String,UploadedFile> files              = new HashMap<String,UploadedFile>();
075            private final Map<String,List<String>> parameters   = new TreeMap<String,List<String>>();               // 5.6.5.2 (2013/06/21) ソートしますã?
076    
077            // 5.7.1.1 (2013/12/13) HTML5 ファイルアãƒ??ロードã?è¤?•°選択ï¼?ultiple?‰対å¿?
078    //      private final Map<String,UploadedFile> files              = new TreeMap<String,UploadedFile>();             // 5.6.5.2 (2013/06/21) ソートしますã?
079            private final List<UploadedFile> files                            = new ArrayList<UploadedFile>();                  // 5.7.1.1 (2013/12/13) HTML5対å¿?
080    
081            /**
082             * MultipartRequest オブジェクトを構築しますã?
083             *
084             * 引数として、ファイルアãƒ??ロード時の保存フォルãƒ??æœ?¤§サイズ、エンコードã?
085             * 新しいファイル名などを指定できますã?新しいファイル名ã?、アãƒ??ロードされる
086             * ファイルがä¸?�¤ã�?�‘の場合に使用できますã?è¤?•°のファイルを同時に変更したã�?
087             * 場合ã?、アãƒ??ロードルールにのっとりã?リクエストパラメータでæŒ?®šしてくださいã€?
088             *
089             * HTML5 では、ファイルアãƒ??ロード時に、multiple 属æ???nputタグのtype="file"?‰を
090             * 付ける事で、ファイルをè¤?•°選択できますã?
091             * そã?場合ã?、inputのname属æ?は、ä¸?�¤なので、_NEW による名前の書き換えã?できませんã€?
092             *
093             * @og.rev 3.8.1.3A (2006/01/30) 新ファイル名にオリジナルファイル名ã?拡張子をセãƒ?ƒˆしまã�?
094             * @og.rev 4.0.0.0 (2007/11/28) メソãƒ?ƒ‰の戻りå?をチェãƒ?‚¯しますã?
095             * @og.rev 5.5.2.6 (2012/05/25) findbugs対応ã?staticフィールドへの書き込みに、AtomicInteger を利用しますã?
096             * @og.rev 5.6.5.3 (2013/06/28) useBackup引数追åŠ?
097             * @og.rev 5.7.1.1 (2013/12/13) HTML5 ファイルアãƒ??ロードã?è¤?•°選択ï¼?ultiple?‰対å¿?
098             * @og.rev 5.7.4.3 (2014/03/28) inputFilename のリクエスト変数処ç�?¿½åŠ?
099             *
100             * @param       request HttpServletRequestオブジェクãƒ?
101             * @param       saveDirectory   ファイルアãƒ??ロードがあったå?合ã?保存フォルãƒ?��
102             * @param       maxPostSize     ファイルアãƒ??ロード時のæœ?¤§ファイルサイズ(Byte)0,またã?マイナスで無制é™?
103             * @param       encoding        ファイルのエンコーãƒ?
104             * @param       inputFilename   アãƒ??ロードされたファイルの新しい名前
105             * @param       useBackup               ファイルアãƒ??ロード時に、バãƒ?‚¯アãƒ??処ç�?�™るかどã�?�‹[true/false]を指å®?
106             * @throws IOException 入出力エラーが発生したとã�?
107             */
108            public MultipartRequest(final HttpServletRequest request,
109                                                            final String saveDirectory,
110                                                            final int maxPostSize,
111                                                            final String  encoding,
112    //                                                      final String  inputFilename ) throws IOException {
113                                                            final String  inputFilename,
114                                                            final boolean useBackup ) throws IOException {                  // 5.6.5.3 (2013/06/28) 追åŠ?
115    
116                    if(request == null) {
117                            throw new IllegalArgumentException("request cannot be null");
118                    }
119    
120                    if(saveDirectory == null) {
121                            throw new IllegalArgumentException("saveDirectory cannot be null");
122                    }
123                    // 5.5.2.6 (2012/05/25) 0,またã?マイナスで無制é™?
124    //              if(maxPostSize <= 0) {
125    //                      throw new IllegalArgumentException("maxPostSize must be positive");
126    //              }
127    
128                    // Save the dir
129                    File dir = new File(saveDirectory);
130    
131                    // Check saveDirectory is truly a directory
132                    if(!dir.isDirectory()) {
133                            throw new IllegalArgumentException("Not a directory: " + saveDirectory);
134                    }
135    
136                    // Check saveDirectory is writable
137                    if(!dir.canWrite()) {
138                            throw new IllegalArgumentException("Not writable: " + saveDirectory);
139                    }
140    
141                    // Parse the incoming multipart, storing files in the dir provided,
142                    // and populate the meta objects which describe what we found
143                    MultipartParser parser = new MultipartParser(request, maxPostSize);
144                    if(encoding != null) {
145                            parser.setEncoding(encoding);
146                    }
147    
148                    // 5.7.1.1 (2013/12/13) HTML5 ファイルアãƒ??ロードã?è¤?•°選択ï¼?ultiple?‰対å¿?
149    //              List<String> list = new ArrayList<String>();
150    
151                    Part part;
152                    while ((part = parser.readNextPart()) != null) {
153                            String name = part.getName();
154                            if( part.isParam() && part instanceof ParamPart ) {
155                                    ParamPart paramPart = (ParamPart)part;
156                                    String value = paramPart.getStringValue();
157                                    List<String> existingValues = parameters.get(name);
158                                    if(existingValues == null) {
159                                            existingValues = new ArrayList<String>();
160                                            parameters.put(name, existingValues);
161                                    }
162                                    existingValues.add(value);
163                            }
164                            else if( part.isFile() && part instanceof FilePart ) {
165                                    FilePart filePart = (FilePart)part;
166    //                              String fileName = filePart.getFilename();
167                                    String orgName = filePart.getFilename();                // 5.7.1.1 (2013/12/13) 判りやすいように変数名変更
168    //                              if(fileName != null) {
169                                    if(orgName != null) {
170                                            // 5.7.1.1 (2013/12/13) HTML5 ファイルアãƒ??ロードã?è¤?•°選択ï¼?ultiple?‰対å¿?
171                                            // 同ä¸?name で、è¤?•°ファイルを扱ã�?¿?¦�がありますã?
172    //                                      list.add( name );               // 3.5.6.5 (2004/08/09) æŒ?®šã? name 属æ?
173                                            // 3.8.1.2 (2005/12/19) 仮ファイルでセーブするã?
174    //                                      String newName = String.valueOf( dumyNewFileCnt++ ) ;   // 3.8.1.4 (2006/03/17)
175    //                                      String newName = String.valueOf( dumyNewFileCnt.getAndIncrement() ) ;   // 5.5.2.6 (2012/05/25) findbugs対å¿?
176                                            String uniqKey = RANDOM_KEY + dumyNewFileCnt.getAndIncrement() ;                // 5.6.5.3 (2013/06/28) アãƒ??ロード時のãƒ?ƒŸーファイル名をもう少しã�?�‘ランãƒ?ƒ にするã€?
177    //                                      filePart.setFilename( newName );                        // 5.6.5.3 (2013/06/28) newName はã‚?‚„こしã�??で、変更
178                                            filePart.setFilename( uniqKey );
179                                            filePart.writeTo(dir);
180    
181                                            // 5.7.1.1 (2013/12/13) HTML5 ファイルアãƒ??ロードã?è¤?•°選択ï¼?ultiple?‰対å¿?
182                                            files.add( new UploadedFile(
183                                                                                            uniqKey,                // 5.7.1.1 (2013/12/13) é ?•ª変更
184                                                                                            dir.toString(),
185                                                                                            name,                   // 5.7.1.1 (2013/12/13) é ?›®追åŠ?
186    //                                                                                      fileName,
187                                                                                            orgName,
188                                                                                            filePart.getContentType()));
189    
190    //                                      files.put(name,
191    //                                                        new UploadedFile( dir.toString(),
192    ////                                                                                            newName,        // 3.8.1.2 (2005/12/19)
193    //                                                                                              tempName,               // 3.8.1.2 (2005/12/19)
194    //                                                                                              fileName,
195    //                                                                                              filePart.getContentType()));
196                                    }
197    //                              else {
198    //                                      files.put(name, new UploadedFile(null, null, null, null));
199    //                              }
200                            }
201                            else {
202                                    String errMsg = "Partオブジェクトが、ParamPartでã‚?ilePartでもありませんã€?
203                                                            + " class=[" + part.getClass() + "]";
204                                    throw new RuntimeException( errMsg );
205                            }
206                    }
207    
208                    // 5.7.4.3 (2014/03/28) inputFilename は、リクエスト変数が使えるようにしますã?
209                    String filename = getReqParamFileName( inputFilename ) ;
210    
211                    // 3.5.6.5 (2004/08/09) 登録後にファイルをリネã?ãƒ?�—ますã?
212                    // 5.7.1.1 (2013/12/13) HTML5 ファイルアãƒ??ロードã?è¤?•°選択ï¼?ultiple?‰対å¿?
213    //              int size = list.size();
214                    int size = files.size();
215    
216                    // 5.7.1.2 (2013/12/20) zip 対å¿?
217                    File[] tgtFiles = new File[size];
218    //              boolean isZip = ( inputFilename != null && inputFilename.endsWith( ".zip" ) );
219                    boolean isZip = ( filename != null && filename.endsWith( ".zip" ) );
220    
221                    for( int i=0; i<size; i++ ) {
222    //                      String name = list.get(i);
223    //                      File file = getFile( name );
224                            UploadedFile upFile = files.get(i);
225                            String name = upFile.getName();         // 5.7.1.1 (2013/12/13)
226    
227    //                      String newName = (isZip) ? null : inputFilename ;
228                            String newName = (isZip) ? null : filename ;
229                            if( newName == null && name != null ) {
230                                    int adrs = name.lastIndexOf( HybsSystem.JOINT_STRING ); // カラãƒ?_行番号 の __ の位置
231                                    if( adrs < 0 ) {
232                                            newName = getParameter( name + "_NEW" );
233                                    }
234                                    else {
235                                            newName = getParameter( name.substring( 0,adrs ) + "_NEW" + name.substring( adrs ) );
236                                    }
237                            }
238    
239                            // 5.7.1.1 (2013/12/13) UploadedFile å†?�§処ç�?�™るよã�?�«変更
240                            tgtFiles[i] = upFile.renameTo( newName,useBackup );
241    
242    //                      // 3.8.1.3 (2006/02/06) 新ファイル名に拡張子がなã�?�¨ã�?
243    //                      // 旧ファイル名から拡張子取得し新ファイル名にæ–?­—å?連çµ?
244    //                      if( newName != null && newName.length() > 0 ) {
245    //                              // 新ファイル名から拡張子取å¾?
246    //                              String newExt = getExtension( newName );
247    //                              if( newExt == null || newExt.length() == 0 ) {
248    ////                                    String oldExt = getExtension( getOriginalFileName( name ) );            // 5.7.1.1 (2013/12/13)
249    //                                      String oldExt = getExtension( upFile.getOriginalFileName() );
250    ////                                    newName = new StringBuilder().append( newName ).append( "." ).append( oldExt ).toString();
251    //                                      newName = newName + "." + oldExt ;
252    //                              }
253    //                      }
254    //                      else {
255    ////                            newName = getOriginalFileName( name );          // 5.7.1.1 (2013/12/13)
256    //                              newName = upFile.getOriginalFileName();
257    //                      }
258    //
259    //                      // 3.8.1.2 (2005/12/19) 基本çš?�«はすべてのケースでファイル名変更が発生するã?
260    //                      File file = upFile.getFile();           // 5.7.1.1 (2013/12/13)
261    //                      if( file != null && newName != null && newName.length() > 0 ) {
262    //                              File newFile = new File( dir,newName );
263    //
264    //                              // 5.6.5.3 (2013/06/28) useBackup ファイルアãƒ??ロード時に、バãƒ?‚¯アãƒ??処ç�?�™るかどã�?�‹[true/false]を指å®?
265    ////                            if( newFile.exists() && !newFile.delete() ) {
266    ////                                    String errMsg = "既存ã?ファイル[" + newName + "]が削除できませんでしたã€?;
267    ////                                    throw new RuntimeException( errMsg );
268    ////                            }
269    //                              if( newFile.exists() ) {
270    //                                      if( useBackup ) {
271    //                                              // newName にフォルãƒ?šŽ層を含ã‚??合に、そなえてã€?
272    //                                              File parent = newFile.getParentFile();                  // バックアãƒ??すべきファイルのフォルãƒ?
273    //                                              File backup = new File( parent , "_backup" );   // そã?直下にã€?_backup" フォルãƒ?‚’作æ?
274    //                                              if( backup != null && !backup.exists() && !backup.mkdirs() ) {
275    //                                                      String errMsg = "バックアãƒ??処ç�?�§backupフォルãƒ??作æ?に失敗しましたã€?" + backup + "]";
276    //                                                      throw new RuntimeException( errMsg );
277    //                                              }
278    //                                              // バックアãƒ??ファイル名ã?、å?のファイルå�?拡張子含ã‚? ??"_" + 現在時刻のlong値 + "." + å…??ファイルの拡張å­?
279    //                                              String bkupName = newFile.getName() + "_" + System.currentTimeMillis() + "."  + getExtension( newName ) ;
280    //                                              File fromFile = new File( dir,newName );                // オリジナルの newFile をrename するとまずいので、同名ã?Fileオブジェクトを作æ?
281    //                                              File bkupFile = new File( backup,bkupName );
282    //
283    //                                              if( !fromFile.renameTo( bkupFile ) ) {
284    //                                                      String errMsg = "バックアãƒ??処ç�?�§バックアãƒ??ファイルをリネã?ãƒ?�§きませんでしたã€?" + bkupFile + "]" ;
285    //                                                      throw new RuntimeException( errMsg );
286    //                                              }
287    //                                      }
288    //                                      else if( !newFile.delete() ) {
289    //                                              String errMsg = "既存ã?ファイル[" + newName + "]が削除できませんでしたã€?;
290    //                                              throw new RuntimeException( errMsg );
291    //                                      }
292    //                              }
293    //
294    ////                            file.renameTo( newFile );
295    //                              if( !file.renameTo( newFile ) ) {
296    //                                      String errMsg = "æ‰?®šã?ファイルをリネã?ãƒ?�§きませんでしたã€?" + file + "]" ;
297    //                                      throw new RuntimeException( errMsg );
298    //                              }
299    ////                            UploadedFile fup = files.get( name );
300    ////                            fup.setFilesystemName( newName );
301    //                              upFile.setFilesystemName( newName );
302    //                      }
303                    }
304                    // 5.7.1.2 (2013/12/20) zip 対å¿?
305                    // 5.7.4.3 (2014/03/28) ä¸?—¦保留にしてã�?�¾したがã?復活しますã?
306            //      if( isZip ) {
307    //      //              File zipFile = new File( saveDirectory,inputFilename );
308            //              File zipFile = new File( saveDirectory,filename );
309            //              ZipArchive.compress( tgtFiles,zipFile );
310            //      }
311            }
312    
313            /**
314             * リクエストパラメータの名前配å?を取得しますã?
315             *
316             * @return      リクエストパラメータの名前配å?
317             */
318            public String[] getParameterNames() {
319                    Set<String> keyset = parameters.keySet();
320                    return keyset.toArray( new String[keyset.size()] );
321            }
322    
323            /**
324             * ファイルアãƒ??ロードされたファイル群のファイル名é?列を取得しますã?
325             *
326             * @og.rev 5.7.1.1 (2013/12/13) HTML5 ファイルアãƒ??ロードã?è¤?•°選択ï¼?ultiple?‰対応ã?為、å»?­¢
327             *
328             * @return      アãƒ??ロードされたファイル名é?åˆ?
329             */
330    //      public String[] getFilenames() {
331    //              Set<String> keyset = files.keySet();
332    //              return keyset.toArray( new String[keyset.size()] );
333    //      }
334    
335            /**
336             * ファイルアãƒ??ロードされたファイル群のファイル配å?を取得しますã?
337             *
338             * @og.rev 5.7.1.1 (2013/12/13) HTML5 ファイルアãƒ??ロードã?è¤?•°選択ï¼?ultiple?‰対å¿?
339             *
340             * @return      アãƒ??ロードされたファイル群
341             */
342            public UploadedFile[] getUploadedFile() {
343                    return files.toArray( new UploadedFile[files.size()] );
344            }
345    
346            /**
347             * æŒ?®šã?名前のリクエストパラメータの値を取得しますã?
348             *
349             * è¤?•°存在する場合ã?、ä¸?•ªæœ?¾Œã?値を返しますã?
350             *
351             * @param       name    リクエストパラメータå�?
352             *
353             * @return      パラメータの値
354             */
355            public String getParameter( final String name ) {
356                    List<String> values = parameters.get(name);
357                    if( values == null || values.isEmpty() ) {
358                            return null;
359                    }
360                    return values.get(values.size() - 1);
361            }
362    
363            /**
364             * æŒ?®šã?名前のリクエストパラメータの値をé?列型式で取得しますã?
365             *
366             * @og.rev 5.3.2.0 (2011/02/01) 新規作æ?
367             *
368             * @param       name    リクエストパラメータå�?
369             *
370             * @return      パラメータの値配å?
371             */
372            public String[] getParameters( final String name ) {
373                    List<String> values = parameters.get(name);
374                    if( values == null || values.isEmpty() ) {
375                            return null;
376                    }
377    //              return values.toArray( new String[0] );
378                    return values.toArray( new String[values.size()] );
379            }
380    
381            /**
382             * æŒ?®šã?名前のリクエストパラメータの値をé?åˆ?int)型式で取得しますã?
383             *
384             * @og.rev 5.3.2.0 (2011/02/01) 新規作æ?
385             * @og.rev 5.3.6.0 (2011/06/01) 配å?値ã�?"の場合にNumberFormatExceptionが発生するバグを修正
386             *
387             * @param       name    リクエストパラメータå�?
388             *
389             * @return      パラメータの値配å?
390             */
391            public int[] getIntParameters( final String name ) {
392                    List<String> values = parameters.get(name);
393                    if( values == null || values.isEmpty() ) {
394                            return null;
395                    }
396    
397    //              int[] rtn = new int[values.size()];
398    //              for( int i=0; i<values.size(); i++ ) {
399    //                      rtn[i] = Integer.valueOf( values.get(i) );
400    //              }
401    
402                    // 5.3.6.0 (2011/06/01) ゼロストリング("")はint変換対象から予め除外すã‚?
403                    List<Integer> intVals = new ArrayList<Integer>();
404                    for( int i=0; i<values.size(); i++ ) {
405                            String str = values.get(i);
406                            if( str != null && str.length() > 0 ) {
407                                    intVals.add( Integer.parseInt( str ) );
408                            }
409                    }
410                    if( intVals.isEmpty() ) {
411                            return null;
412                    }
413    
414                    int[] rtn = new int[intVals.size()];
415                    for( int i=0; i<intVals.size(); i++ ) {
416                            rtn[i] = intVals.get(i).intValue();
417                    }
418    
419                    return rtn;
420            }
421    
422            /**
423             * æŒ?®šã?名前の ファイル名ã?リクエスト変数処ç�?‚’行いますã?
424             *
425             * filename 属æ?のみ、{&#064;XXXX} のリクエスト変数が使えるようにしますã?
426             *
427             * @og.rev 5.7.4.3 (2014/03/28) 新規追åŠ?
428             *
429             * @param       fname   ファイルå�?
430             * @return      リクエスト変数をå?ç�?�—たファイルå�?
431             */
432            private String getReqParamFileName( final String fname ) {
433    
434                    String rtn = fname ;
435                    if( fname != null ) {
436                            StringBuilder filename = new StringBuilder( fname ) ;
437                            int st = filename.indexOf( "{@" );
438                            while( st >= 0 ) {
439                                    int ed = filename.indexOf( "}",st );
440                                    if( ed < 0 ) {
441                                            String errMsg = "{@XXXX} の対応関係が取れてã�?�¾せんã€?
442                                                                    + " filename=[" + fname + "]";
443                                            throw new RuntimeException( errMsg );
444                                    }
445                                    String key = filename.substring( st+2,ed );             // "}" はåˆ?‚Š出し対象外にするã€?
446                                    String val = getParameter( key );
447                                    filename.replace( st,ed+1,val );                                // "}" を含めて置換したいので、ed+1
448                                    // 次の "{@" を探すã?開始ã?置換文字数が不æ?なので、st から始めるã?
449                                    st = filename.indexOf( "{@",st );
450                            }
451                            rtn = filename.toString();
452                    }
453                    return rtn ;
454            }
455    
456            /**
457             * æŒ?®šã?名前の UploadedFile オブジェクトかã‚?登録されるファイル名を取得しますã?
458             *
459             * 登録されるファイル名とは、新たに書き換えられたファイル名ã?ことですã?
460             *
461             * @og.rev 5.6.6.1 (2013/07/12) null 対ç­?
462             * @og.rev 5.7.1.1 (2013/12/13) HTML5 ファイルアãƒ??ロードã?è¤?•°選択ï¼?ultiple?‰対応ã?ためå»?­¢
463             *
464             * @param       name    キーæƒ??
465             *
466             * @return      新たに書き換えられたファイルå�?
467             */
468    //      public String getFilesystemName( final String name ) {
469    //              UploadedFile file = files.get(name);
470    ////            return file.getFilesystemName();  // may be null
471    //              return (file == null) ? null : file.getFilesystemName();  // may be null
472    //      }
473    
474            /**
475             * æŒ?®šã?名前の UploadedFile オブジェクトかã‚?アãƒ??ロードされたファイル名を取得しますã?
476             *
477             * アãƒ??ロードされたファイル名とは、オリジナルのファイル名ã?ことですã?
478             *
479             * @og.rev 5.6.6.1 (2013/07/12) null 対ç­?
480             * @og.rev 5.7.1.1 (2013/12/13) HTML5 ファイルアãƒ??ロードã?è¤?•°選択ï¼?ultiple?‰対応ã?ためå»?­¢
481             *
482             * @param       name    キーæƒ??
483             *
484             * @return      オリジナルのファイルå�?
485             */
486    //      public String getOriginalFileName( final String name ) {
487    //              UploadedFile file = files.get(name);
488    ////            return file.getOriginalFileName();  // may be null
489    //              return (file == null) ? null : file.getOriginalFileName();  // may be null
490    //      }
491    
492            /**
493             * æŒ?®šã?名前の UploadedFile オブジェクトかã‚?File オブジェクトを取得しますã?
494             *
495             * @og.rev 5.6.6.1 (2013/07/12) null 対ç­?
496             * @og.rev 5.7.1.1 (2013/12/13) HTML5 ファイルアãƒ??ロードã?è¤?•°選択ï¼?ultiple?‰対å¿?
497             *
498             * @param       name    キーæƒ??
499             *
500             * @return      Fileオブジェクãƒ?
501             */
502    //      public File getFile( final String name ) {
503    //              UploadedFile file = files.get(name);
504    ////            return file.getFile();  // may be null
505    //              return (file == null) ? null : file.getFile();  // may be null
506    //      }
507    
508            /**
509             * ファイル名かã‚?拡張子を取得しますã?
510             *
511             * @og.rev 5.7.1.1 (2013/12/13) UploadedFileクラスに移å‹?
512             *
513             * @param       fileName        ファイルå�?
514             * @return      拡張å­?
515             */
516    //      private String getExtension( final String fileName ) {
517    //              int index = fileName.lastIndexOf('.');
518    //              if(index!=-1) {
519    //                      return fileName.substring(index + 1, fileName.length());
520    //              }
521    //              return "";
522    //      }
523    }
524    
525    /**
526     * ファイルをサーバã?にアãƒ??ロードするå?合に使用されるファイル管ç�??部クラスですã?
527     *
528     * @og.group そã?他機è?
529     * @og.rev 5.7.1.1 (2013/12/13) HTML5 ファイルアãƒ??ロードã?è¤?•°選択ï¼?ultiple?‰対応ã?ため、publicåŒ?
530     *
531     * @version  4.0
532     * @author       Kazuhiko Hasegawa
533     * @since    JDK5.0,
534     */
535    //final class UploadedFile {
536    //
537    //      private String filename;
538    //      private final String name;
539    //      private final String dir;
540    //      private final String original;
541    //      private final String type;
542    //
543    //      /**
544    //       * アãƒ??ロードファイルの管ç�?‚ªブジェクトを作æ?しますã?
545    //       *
546    //       * @og.rev 5.7.1.1 (2013/12/13) HTML5 ファイルアãƒ??ロードã?è¤?•°選択ï¼?ultiple?‰対å¿?
547    //       *
548    //       * @param       dir     ファイルを保管するフォルãƒ?
549    //       * @param       name            ファイルアãƒ??ロードされた時ã?name属æ?
550    //       * @param       filename        ファイルå�?置き換えå¾?
551    //       * @param       original        ファイルå�?オリジナル)
552    //       * @param       type    コンãƒ?ƒ³トタイãƒ?
553    //       */
554    //      UploadedFile( final String dir, final String name, final String filename, final String original, final String type) {
555    //              this.dir                = dir;
556    //              this.name               = name;
557    //              this.filename   = filename;
558    //              this.original   = original;
559    //              this.type               = type;
560    //      }
561    //
562    //      /**
563    //       * ファイルアãƒ??ロードされた時ã?name属æ?を取得しますã?
564    //       *
565    //       * @og.rev 5.7.1.1 (2013/12/13) HTML5 ファイルアãƒ??ロードã?è¤?•°選択ï¼?ultiple?‰対å¿?
566    //       *
567    //       * @return      ファイルアãƒ??ロードされた時ã?name属æ?
568    //       */
569    //      public String getName() {
570    //              return name;
571    //      }
572    //
573    //      /**
574    //       * コンãƒ?ƒ³トタイプを取得しますã?
575    //       *
576    //       * @return      コンãƒ?ƒ³トタイãƒ?
577    //       */
578    //      public String getContentType() {
579    //              return type;
580    //      }
581    //
582    //      /**
583    //       * ファイルå�?置き換えå¾?を取得しますã?
584    //       *
585    //       * @return      ファイルå�?置き換えå¾?
586    //       */
587    //      public String getFilesystemName() {
588    //              return filename;
589    //      }
590    //
591    //      /**
592    //       * ファイルå�?置き換えå¾?をセãƒ?ƒˆしますã?
593    //       *
594    //       * @param       name    ファイルå�?置き換えå¾?
595    //       */
596    //      public void setFilesystemName( final String name ) {
597    //              filename = name;
598    //      }
599    //
600    //      /**
601    //       * ファイルå�?オリジナル)を取得しますã?
602    //       *
603    //       * @return      ファイルå�?オリジナル)
604    //       */
605    //      public String getOriginalFileName() {
606    //              return original;
607    //      }
608    //
609    //      /**
610    //       * ファイルå�?置き換えå¾?の File オブジェクトを取得しますã?
611    //       *
612    //       * @return File File オブジェクãƒ?
613    //       */
614    //      public File getFile() {
615    //              if(dir == null || filename == null) {
616    //                      return null;
617    //              }
618    //              else {
619    //                      return new File(dir + File.separator + filename);
620    //              }
621    //      }
622    //}