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 java.io.File; 019 import java.io.IOException; 020 021 import org.opengion.fukurou.util.FileUtil; 022 023 /** 024 * ファイルをサーバ?にア??ロードする?合に使用されるファイル管?ラスです? 025 * HTML5 ファイルア??ロード??選択?ultiple?対?に伴???のクラスとして public化します? 026 * 027 * @og.group そ?他機? 028 * @og.rev 5.7.1.1 (2013/12/13) HTML5 ファイルア??ロード??選択?ultiple?対? 029 * 030 * @version 4.0 031 * @author Kazuhiko Hasegawa 032 * @since JDK5.0, 033 */ 034 public final class UploadedFile implements Comparable<UploadedFile> { 035 036 /** バッファの初期容量を通常より多い目に設定します? {@value} */ 037 public static final int BUFFER_MIDDLE = 200; 038 039 /** シス?依存?改行記号をセ?します? */ 040 public static final String CR = System.getProperty("line.separator"); 041 042 private File filename = null; // 現時点での置き換え後ファイル? 043 044 private final String uniqKey ; // ア??ロードされたファイル?ユニ?クにしておきま? 045 private final String dir; 046 private final String name; 047 private final String original; 048 private final String type; 049 050 /** 051 * ア??ロードファイルの管?ブジェクトを作?します? 052 * 053 * @og.rev 5.7.1.1 (2013/12/13) HTML5 ファイルア??ロード??選択?ultiple?対? 054 * 055 * @param uniqKey ユニ?クキー(初期ア??ロードファイル? 056 * @param dir ファイルを保管するフォル? 057 * @param name ファイルア??ロードされた時?name属? 058 * @param original ファイル?オリジナル) 059 * @param type コン?トタイ? 060 */ 061 // UploadedFile( final String dir, final String name, final String filename, final String original, final String type) { 062 UploadedFile( final String uniqKey, final String dir, final String name, final String original, final String type ) { 063 this.uniqKey = uniqKey; // 5.7.1.1 (2013/12/13) uniqKey を確定させる? 064 this.dir = dir; 065 this.name = name; 066 // this.filename = filename; 067 this.original = original; 068 this.type = type; 069 } 070 071 /** 072 * ファイルア??ロードされた時?name属?を取得します? 073 * 074 * @og.rev 5.7.1.1 (2013/12/13) HTML5 ファイルア??ロード??選択?ultiple?対? 075 * 076 * @return ファイルア??ロードされた時?name属? 077 */ 078 public String getName() { 079 return name; 080 } 081 082 /** 083 * コン?トタイプを取得します? 084 * 085 * @return コン?トタイ? 086 */ 087 public String getContentType() { 088 return type; 089 } 090 091 /** 092 * ファイル?置き換え?を取得します? 093 * 094 * @og.rev 5.7.1.2 (2013/12/20) zip 対応で、Fileオブジェクトを返すようにします? 095 * 096 * @return ファイル?置き換え? 097 */ 098 // public String getFilesystemName() { 099 public File getUploadFile() { 100 return filename; 101 } 102 103 /** 104 * ファイル?置き換え?の置き換えを実行します? 105 * useBackup = true にすると、dir の直下に?_backup" フォル?作?します? 106 * バックア??ファイル名?、?のファイル?拡張子含? ??"_" + 現在時刻のlong値 + "." + ??ファイルの拡張? 107 * 108 * newName ?null の場合?、original のファイル名に、変換します? 109 * 110 * @og.rev 5.7.1.1 (2013/12/13) 新規追? 111 * @og.rev 5.7.2.1 (2014/01/17) FileUtil.renameTo の引数の?を間違えて?? 112 * 113 * @param newName ファイル?置き換え? 114 * @param useBackup 置き換え後ファイルをバ?ア??するかど?(true:バックア??する/false:しな? 115 * @return ?的に作?されたファイルオブジェク? 116 */ 117 public File renameTo( final String newName , final boolean useBackup ) { 118 119 String newNm = newName ; 120 // 新規ファイル名を作?します?(拡張子? 121 if( newNm != null && newNm.length() > 0 ) { 122 // 新ファイル名から拡張子取? 123 String newExt = FileUtil.getExtension( newNm ); 124 if( newExt == null || newExt.length() == 0 ) { 125 String oldExt = FileUtil.getExtension( original ); 126 newNm = newNm + "." + oldExt ; 127 } 128 } 129 else { 130 newNm = original; 131 } 132 133 File newFile = null ; 134 if( newNm != null && newNm.length() > 0 ) { 135 newFile = new File( dir,newNm ); 136 137 File uniqFile = new File( dir , uniqKey ); // 5.7.1.1 (2013/12/13) ア??ロードされたファイル 138 139 // 5.7.2.1 (2014/01/17) FileUtil.renameTo の引数の?を間違えて?? 140 // FileUtil.renameTo( newFile, uniqFile , useBackup ); 141 FileUtil.renameTo( uniqFile , newFile, useBackup ); // from ?to の?に?? 142 143 // // 置き換えファイルの存在チェ?? 144 // if( newFile.exists() ) { 145 // if( useBackup ) { 146 // // newNm にフォル?層を含??合に、そなえて? 147 // File parent = newFile.getParentFile(); // バックア??すべきファイルのフォル? 148 // File backup = new File( parent , "_backup" ); // そ?直下に?_backup" フォル?作? 149 // if( !backup.exists() && !backup.mkdirs() ) { 150 // String errMsg = "バックア??処?backupフォル??作?に失敗しました?" + backup + "]"; 151 // throw new RuntimeException( errMsg ); 152 // } 153 // // バックア??ファイル名?、?のファイル?拡張子含? ??"_" + 現在時刻のlong値 + "." + ??ファイルの拡張? 154 // String bkupName = newFile.getName() + "_" + System.currentTimeMillis() + "." + FileUtil.getExtension( newNm ) ; 155 // File fromFile = new File( dir,newNm ); // オリジナルの newFile をrename するとまずいので、同名?Fileオブジェクトを作? 156 // File bkupFile = new File( backup,bkupName ); 157 // 158 // if( !fromFile.renameTo( bkupFile ) ) { 159 // String errMsg = "バックア??処?バックア??ファイルをリネ??きませんでした? +CR 160 // + " [" + fromFile + "] ?[" + bkupFile + "]" ; 161 // throw new RuntimeException( errMsg ); 162 // } 163 // } 164 // else if( !newFile.delete() ) { 165 // String errMsg = "既存?ファイル[" + newNm + "]が削除できませんでした?; 166 // throw new RuntimeException( errMsg ); 167 // } 168 // } 169 // 170 // File uniqFile = new File( dir , uniqKey ); // 5.7.1.1 (2013/12/13) ア??ロードされたファイル 171 // if( !uniqFile.renameTo( newFile ) ) { 172 // String errMsg = "??ファイルをリネ??きませんでした? + CR 173 // + " [" + uniqFile + "] ?[" + newFile + "]" ; 174 // throw new RuntimeException( errMsg ); 175 // } 176 } 177 // 5.7.1.1 (2013/12/13) ここの処?走ることは無??ず? 178 else { 179 String errMsg = "新ファイル名が存在しません?" + newNm + "]" ; 180 throw new RuntimeException( errMsg ); 181 } 182 // 新ファイル名?セ?は、すべての処?完?てから、設定する? 183 filename = newFile ; 184 return filename; 185 } 186 187 /** 188 * ファイル?置き換え?をセ?します? 189 * 190 * @og.rev 5.7.1.1 (2013/12/13) ? 191 * 192 * @param name ファイル?置き換え? 193 */ 194 // public void setFilesystemName( final String name ) { 195 // filename = name; 196 // } 197 198 /** 199 * ファイル?オリジナル)を取得します? 200 * 201 * @return ファイル?オリジナル) 202 */ 203 public String getOriginalFileName() { 204 return original; 205 } 206 207 /** 208 * ファイル?置き換え?の File オブジェクトを取得します? 209 * 210 * @og.rev 5.7.1.1 (2013/12/13) ?? 211 * 212 * @return Fileオブジェク? 213 */ 214 // public File getFile() { 215 // if(dir == null || filename == null) { 216 // return null; 217 // } 218 // else { 219 // return new File(dir + File.separator + filename); 220 // } 221 // } 222 223 /** 224 * ファイル名か?拡張子を取得します? 225 * 226 * @og.rev 5.7.1.1 (2013/12/13) ローカルに移動?若干のロジ?変更 227 * 228 * @param fileName ファイル? 229 * @return 拡張? 230 */ 231 // private String getExtension( final String fileName ) { 232 // int index = fileName.lastIndexOf('.'); 233 //// if(index!=-1) { 234 //// return fileName.substring(index + 1, fileName.length()); 235 //// } 236 // if( index >= 0 ) { 237 // return fileName.substring( index + 1 ); 238 // } 239 // return ""; 240 // } 241 242 /** 243 * 自然比?ソ? 244 * インタフェース Comparable の 実?関連して、?定義して?す? 245 * 登録されたシーケンス(画面の表示?で比?ます? 246 * equals メソ?では、キーの同??のみに?して判定して?す? 247 * こ?比?は?運用上同?ーは発生しません?たとえ同?ーが存在した 248 * としても?そ?比??が同じになることを保証して?せん? 249 * 250 * @param other 比?象のObject 251 * 252 * @return こ?オブジェクトが?されたオブジェクトより小さ??合???整数、等し??合?ゼロ、大きい場合?正の整数 253 * @throws ClassCastException 引数?UploadedFile ではな??? 254 * @throws IllegalArgumentException 引数?null の場? 255 */ 256 @Override 257 public int compareTo( final UploadedFile other ) { 258 if( other == null ) { 259 String errMsg = "引数が?null です?" ; 260 throw new IllegalArgumentException( errMsg ); 261 } 262 263 return ( uniqKey ).compareTo( other.uniqKey ); 264 } 265 266 /** 267 * こ?オブジェクトと他?オブジェクトが等し?ど?を示します? 268 * 画面は、画面IDが等しければ、?や表示?関係なく同?みなされます? 269 * GUIInfo は、ユーザー個別に扱われ、そのグループには、key は唯?、かつ 270 * 同???で扱われるオブジェクト?為、同?みなします? 271 * 272 * @param object 比?象の参?オブジェク? 273 * 274 * @return 引数に?されたオブジェクトとこ?オブジェクトが等し??合? true、そ?な??合? false 275 */ 276 @Override 277 public boolean equals( final Object object ) { 278 if( object instanceof UploadedFile ) { 279 return uniqKey.equals( ((UploadedFile)object).uniqKey ); 280 } 281 282 return false ; 283 } 284 285 /** 286 * オブジェクト?ハッシュコード?を返します? 287 * こ?メソ?は、java.util.Hashtable によって提供されるような 288 * ハッシュ??ブルで使用するために用意されて?す? 289 * equals( Object ) メソ?をオーバ?ライトした?合?、hashCode() メソ?? 290 * ? 記述する?があります? 291 * こ?実?は、getKey().hashCode() と同?を返します? 292 * 293 * @return こ?オブジェクト?ハッシュコード? 294 */ 295 @Override 296 public int hashCode() { 297 return uniqKey.hashCode() ; 298 } 299 300 /** 301 * オブジェクト?識別子として?詳細な画面??を返します? 302 * 303 * @return 詳細な画面?? 304 */ 305 @Override 306 public String toString() { 307 StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE ); 308 rtn.append( this.getClass().getName() ).append( CR ); 309 rtn.append( " uniqKey :").append( uniqKey ).append( CR ); 310 rtn.append( " filename :").append( filename ).append( CR ); 311 rtn.append( " name :").append( name ).append( CR ); 312 rtn.append( " dir :").append( dir ).append( CR ); 313 rtn.append( " original :").append( original ).append( CR ); 314 rtn.append( " type :").append( type ).append( CR ); 315 return rtn.toString(); 316 } 317 }