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