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 属æ?ã®ã¿ã€{@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 //}