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