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.taglib;
017
018 import static org.opengion.fukurou.util.StringUtil.nval;
019
020 import java.io.File;
021 import java.io.IOException;
022 import java.util.Arrays;
023 import java.util.List;
024 import java.util.ArrayList;
025
026 import javax.servlet.http.HttpServletRequest;
027
028 import org.opengion.fukurou.util.StringUtil;
029 import org.opengion.hayabusa.common.HybsSystem;
030 import org.opengion.hayabusa.common.HybsSystemException;
031 import org.opengion.hayabusa.db.DBColumn;
032 import org.opengion.hayabusa.db.DBTableModel;
033 import org.opengion.hayabusa.db.DBTableModelUtil;
034 import org.opengion.hayabusa.servlet.MultipartRequest;
035 import org.opengion.hayabusa.servlet.UploadedFile;
036
037 /**
038 * クライアント?ファイルをサーバ?にア??ロードするタグです?
039 *
040 * ア??ロード後?属?は、DBTableModel に格納することにより??常の??タと
041 * 同様?取り出し方が可能です?
042 * また?通常のファイルア??ロード時の、form で使用する、enctype="multipart/form-data"
043 * を指定した?合?、他?リクエスト情報も?{@XXXX} 変数で取り出すことが可能です?
044 *
045 * こ? upload タグでは、ア??ロード後に、指定?ファイル名に変更する機?があります?
046 * file 登録?アログで?し?name に?_NEW" と?名称を付けたリクエスト??
047 * ファイルのア??ロードと同時に送信することで、この名前にファイルを付け替えます?
048 * また?ア??ロード後?ファイル名?、name ??名称で、取り?せます?
049 * クライアントから登録したオリジナルのファイル名?、name に?_ORG" と?名称
050 * で取り出すことが可能です?
051 *
052 * 通常では、これらのパラメータを?RequestAttribute 変数にセ?します?で、{@XXXX}で
053 * 取り出すことが可能になります?さらに?KEY","VALUE","ISFILE" のカラ?持った?
054 * DBTableModel にセ?します?
055 *
056 * 新機?として、columns を指定する事で、columns のカラ?持つ DBTableModel にセ?します?
057 * そ?場合?、カラ?_01 ??カラ?_99 のように、アン??バ?で列データとなるキーを定義してください?
058 * アン??バ?がな??合?、カラ?け作?されます?カラ?と同じリクエストがあれば?
059 * すべてのレコードに同じ値がセ?されます?
060 *
061 * 新ファイル名に拡張子が設定されて???合?、オリジナルファイル名?拡張子をセ?します?
062 *
063 * HTML5 の type="file" 時? multiple 属??ア??ロードファイルの?選択機??に対応します?(5.7.1.1 (2013/12/13))
064 * そ?場合?、新しいファイル名への変更はできません。オリジナルのファイル名でア??ロードされま?
065 *
066 * 5.7.1.2 (2013/12/20) zip 対?
067 * filename 属?に?.zip" の拡張子?ファイル名を?した?合?、ア??ロードされた??のファイル?
068 * ZIP圧縮します?これは、ア??ロード後?処?なります?
069 * ZIP圧縮のオリジナルファイルは、そのまま残ります?
070 * なお?ZIPファイルは、useBackup属??true に設定しても?無関係に、上書きされます?
071 *
072 * 5.7.4.3 (2014/03/28) filename 属?のリクエスト変数対?
073 * filename 属?のみ、{@XXXX} のリクエスト変数が使えるようにします?
074 * 他?パラメータでは使えません?
075 * これは、multipart/form-data のリクエストでは、パート??処?しな?、リクエスト変数?
076 * 拾えな?、リクエスト変数は、この、upload タグ以降でのみ利用可能でした?
077 * zip対応と関連付けて、filename 属?のみ、利用できるように、MultipartRequest 側の処??込みます?
078 *
079 * 5.7.6.3 (2014/05/23) ア??ロードファイルのCSVセ?
080 * 個?に?したア??ロードファイル名?、XXX_NEW ?XXX_ORG で取得できますが?
081 * HTML5 の multiple 属?使用時や、ア??ロードされたファイルを??で処?たい場合に
082 * ファイル名を、CSV形式で取り出せるようにします?
083 * キーは、?通で、UPLOAD_FILES とします?
084 *
085 * @og.formSample
086 * ●形式?lt;og:upload fileURL="…" maxPostSize="…" />
087 * ●body?な?
088 *
089 * ●Tag定義??
090 * <og:upload
091 * fileURL 【TAG】ファイルをア??ロードするディレクトリを指定しま?(初期値:FILE_URL[=filetemp/])
092 * filename 【TAG?通常使?せん)ファイルを作?するとき?ファイル名をセ?しま?
093 * maxPostSize 【TAG】最大転送サイズ(Byte)を指定しま?初期値:10485760) 0,また?マイナスで無制限です?
094 * scope 【TAG】キャ?ュする場合?スコープ[request/page/session/applicaton]を指定しま?初期値:session)
095 * tableId 【TAG?通常使?せん)sessionから?す?DBTableModelオブジェクト? ID
096 * columns 【TAG】DBTableModel作?時に、指定?カラ??"_01"??_99"の添え字をレコードとして作?します?
097 * useBackup 【TAG】ファイルア??ロード時に、すでに同名のファイルが存在した場合に、バ?ア??処?renameTo)するかど?[true/false]を指定しま?初期値:false)
098 * language 【TAG】タグ?で使用する?コード[ja/en/zh/…]を指定しま?
099 * debug 【TAG】デバッグ??を?力するかど?[true/false]を指定しま?初期値:false)
100 * />
101 *
102 * ●使用?:
103 * 【query.jsp?
104 * <form method="POST" action="result.jsp" enctype="multipart/form-data" target="RESULT">
105 * <table summary="layout" >
106 * <tr><og:input type="text" name="submitter" value="{@USER.JNAME}" size="20" lbl="MSG0014" /></tr>
107 * <tr>
108 * <og:input type="file" name="file_01" size="30" lbl="MSG0015" />
109 * <og:input name="file_01_NEW" size="10" lbl="FILENAME" />
110 * </tr><tr>
111 * <og:input type="file" name="file_02" size="30" lbl="MSG0015" />
112 * <og:input name="file_02_NEW" size="10" lbl="FILENAME" />
113 * </tr><tr>
114 * <og:input type="file" name="file_03" size="30" lbl="MSG0015" />
115 * <og:input name="file_03_NEW" size="10" lbl="FILENAME" />
116 * </tr><tr>
117 * <og:column name="writable" value="false" />
118 * </tr>
119 * </table>
120 *
121 * 【result.jsp?
122 * <og:upload
123 * fileURL = "{@USER.ID}"
124 * />
125 * <br />
126 * <og:message lbl="MSG0003" comment="ファイルの登録が完?ました? />
127 *
128 * <og:view
129 * command = "NEW"
130 * viewFormType = "HTMLTable"
131 * writable = "{@writable}"
132 * />
133 *
134 * <table>
135 * <tr><og:input name="submitter" value="{@submitter}" /></tr>
136 * <tr><og:input name="writable" value="{@writable}" /></tr>
137 * <tr><og:input name="directory" value="{@directory}" /></tr>
138 * <tr><og:input name="file_01" value="{@file_01}" /></tr>
139 * <tr><og:input name="file_01_NEW" value="{@file_01_NEW}" /></tr>
140 * <tr><og:input name="file_01_ORG" value="{@file_01_ORG}" /></tr>
141 * <tr><og:input name="file_02" value="{@file_02}" /></tr>
142 * <tr><og:input name="file_02_NEW" value="{@file_02_NEW}" /></tr>
143 * <tr><og:input name="file_02_ORG" value="{@file_02_ORG}" /></tr>
144 * <tr><og:input name="file_03" value="{@file_03}" /></tr>
145 * <tr><og:input name="file_03_NEW" value="{@file_03_NEW}" /></tr>
146 * <tr><og:input name="file_03_ORG" value="{@file_03_ORG}" /></tr>
147 * </table>
148 *
149 * 【result.jsp?
150 * <og:upload
151 * fileURL = "{@USER.ID}"
152 * columns = "submitter,file"
153 * />
154 * <br />
155 * <og:message lbl="MSG0003" comment="ファイルの登録が完?ました? />
156 *
157 * <og:view
158 * command = "NEW"
159 * viewFormType = "HTMLTable"
160 * writable = "{@writable}"
161 * />
162 *
163 * @og.group ファイル入?
164 *
165 * @version 4.0
166 * @author Kazuhiko Hasegawa
167 * @since JDK5.0,
168 */
169 public class FileUploadTag extends CommonTagSupport {
170 //* こ?プログラ??VERSION??を設定します? {@value} */
171 private static final String VERSION = "5.7.6.3 (2014/05/23)" ;
172
173 private static final long serialVersionUID = 576320140523L ;
174
175 /** 5.7.6.3 (2014/05/23) ア??ロードファイルのCSVセ?のキー */
176 public static final String UPLOAD_FILES = "UPLOAD_FILES" ;
177
178 // 3.5.2.0 (2003/10/20) カラ?に、ISFILEを追??
179 private static final String[] names = new String[] { "KEY","VALUE","ISFILE" };
180 private static final String ENCODE = "UTF-8"; // 3.5.2.0 (2003/10/20) ?
181 private String fileURL = HybsSystem.sys( "FILE_URL" );
182 private String filename = null; // 3.5.4.2 (2003/12/15)
183
184 private int maxPostSize = 10*1024*1024; // ?ファイル容? 10MB
185 private String tableId = HybsSystem.TBL_MDL_KEY ;
186
187 // 5.6.5.2 (2013/06/21) DBTableModel作?時に、指定?カラ??"_01"??_99"の添え字をレコードとして作?します?
188 private String columns = null;
189 // 5.6.5.3 (2013/06/28) ファイルア??ロード時に、すでに同名のファイルが存在した場合に、バ?ア??処?renameTo)するかど?[true/false]を指定しま?初期値:false)
190 private boolean useBackup = false;
191
192 /**
193 * Taglibの終?グが見つかったときに処??doEndTag() ?オーバ?ライドします?
194 *
195 * @og.rev 2.2.0.0 (2002/12/17) 中国?国際化)対?エンコード?取得方法変更
196 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応?release2() ?doEndTag()で呼ぶ?
197 * @og.rev 3.1.3.0 (2003/04/10) UTF-8 決め打ちのエンコード情報を取得する?
198 * @og.rev 3.5.2.0 (2003/10/20) scope 属?を追??
199 * @og.rev 3.5.4.2 (2003/12/15) ファイル名を?できるようにします?
200 * @og.rev 3.6.0.8 (2004/11/19) DBTableModel をセーブする時に、トランザクションチェ?を行います?
201 * @og.rev 3.7.1.1 (2005/05/23) フォル?な??合?、?階層??フォル?自動で作?します?
202 * @og.rev 3.8.1.3A (2006/01/30) 新ファイル名にオリジナルファイル名?拡張子をセ?しま?
203 * @og.rev 5.3.7.0 (2011/07/01) エラーメ?ージ?変更
204 * @og.rev 5.6.5.2 (2013/06/21) columns 属?の追?
205 * @og.rev 5.6.5.3 (2013/06/28) useBackup 属?の追?
206 *
207 * @return 後続????
208 */
209 @Override
210 public int doEndTag() {
211 debugPrint(); // 4.0.0 (2005/02/28)
212 startQueryTransaction( tableId ); // 3.6.0.8 (2004/11/19)
213 HttpServletRequest request = (HttpServletRequest)getRequest();
214
215 try {
216 String directory = HybsSystem.url2dir( fileURL );
217 File dir = new File(directory);
218 if( ! dir.exists() && ! dir.mkdirs() ) {
219 String errMsg = "?レクトリの作?に失敗しました?" + directory + "]";
220 throw new HybsSystemException( errMsg );
221 }
222
223 // 3.8.1.3A (2006/01/30) 新ファイル名にオリジナルファイル名?拡張子をセ?しま?
224 // MultipartRequest multi = new MultipartRequest( request,directory,maxPostSize,ENCODE,filename );
225 // 5.6.5.3 (2013/06/28) useBackup 属?の追?
226 MultipartRequest multi = new MultipartRequest( request,directory,maxPostSize,ENCODE,filename,useBackup );
227 // 5.6.5.2 (2013/06/21) columns 属?の追?
228 // DBTableModel table = makeDBTable( multi );
229 DBTableModel table = null;
230 if( columns == null ) { // 5.6.5.2 (2013/06/21) columns 属?の追?
231 table = makeDBTable( multi );
232 }
233 else {
234 table = makeDBTableFromClms( multi );
235 }
236
237 // 3.5.2.0 (2003/10/20) scope 属?を追??
238 // 3.6.0.8 (2004/11/19) トランザクションチェ?を行います?
239 if( ! commitTableObject( tableId, table ) ) {
240 jspPrint( "FileUploadTag Query処?割り込まれました?BTableModel は登録しません? );
241 return (SKIP_PAGE);
242 }
243
244 } catch(IOException ex) {
245 // String errMsg = "ファイルの取り扱?にエラーが発生しました?
246 // + toString() + HybsSystem.CR
247 // + "FileURL=" + fileURL + HybsSystem.CR
248 // + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正
249 String errMsg = "ファイル登録エラー??
250 + ex.getMessage() + HybsSystem.CR // 5.3.7.0 (2011/07/01) errMsg 修正
251 + "(" + toString() + HybsSystem.CR
252 + "FileURL=" + fileURL + ")";
253 throw new HybsSystemException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数の並び?更
254 }
255
256 return(EVAL_PAGE);
257 }
258
259 /**
260 * タグリブオブジェクトをリリースします?
261 * キャ?ュされて再利用される?で、フィールド?初期設定を行います?
262 *
263 * @og.rev 2.0.0.4 (2002/09/27) カスタ?グの release() メソ?を?追?
264 * @og.rev 3.0.1.1 (2003/03/06) columns を?
265 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応?release2() ?doEndTag()で呼ぶ?
266 * @og.rev 3.5.4.2 (2003/12/15) ファイル名を?できるようにします?
267 * @og.rev 5.6.5.2 (2013/06/21) columns 属?の追?
268 * @og.rev 5.6.5.2 (2013/06/21) useBackup 属?の追?
269 *
270 */
271 @Override
272 protected void release2() {
273 super.release2();
274 fileURL = HybsSystem.sys( "FILE_URL" );
275 maxPostSize = 10*1024*1024; // ?ファイル容? 10MB
276 tableId = HybsSystem.TBL_MDL_KEY ;
277 filename = null; // 3.5.4.2 (2003/12/15)
278 columns = null; // 5.6.5.2 (2013/06/21)
279 useBackup = false; // 5.6.5.3 (2013/06/28)
280 }
281
282 /**
283 * ファイルア??ロード?実行結果?DBTableModel に記述します?
284 *
285 * ここでは?KEY","VALUE","ISFILE" のカラ?対して、?を設定して?ます?
286 * 同時に、RequestAttribute 変数に、これらの値をセ?することで?
287 * {@XXXX} で値が取り?せる様にして?す?
288 *
289 * @og.rev 2.2.0.0 (2002/12/17) 中国?国際化)対?エンコード?取得方法変更
290 * @og.rev 3.0.1.1 (2003/03/06) request ??から{@XXXX} で値が取り?せる様に修正?
291 * @og.rev 3.5.2.0 (2003/10/20) カラ?(KEY,VALUE)に ISFILE を追?
292 * @og.rev 3.5.6.5 (2004/08/09) MultipartRequest 変更に伴な?正(Enum変更、?ファイル名取?
293 * @og.rev 3.5.6.6 (2004/08/23) 上記変更時?バグ修正?
294 * @og.rev 3.5.6.6 (2004/08/23) ?ァイルのキーを?XXXX_ORG にします?
295 * @og.rev 4.0.0.0 (2007/10/12) ??ブルモ?の登録方法を変更
296 * @og.rev 5.3.2.0 (2011/02/01) チェ?行?パラメーターはint配?側に変換して復?る?パラメーター名を保存する?
297 * @og.rev 5.4.4.2 (2012/02/03) CommonTagSupportと同様?チェ?ボックス判定を行う
298 * @og.rev 5.7.1.1 (2013/12/13) HTML5 ファイルア??ロード??選択?ultiple?対?
299 * @og.rev 5.7.1.2 (2013/12/20) 5.7.1.2 (2013/12/20) zip対応で、UploadedFile のメソ?変更
300 * @og.rev 5.7.3.0 (2014/02/07) zip対応?修正で、取得ファイル名が異なって??
301 * @og.rev 5.7.6.3 (2014/05/23) ア??ロードファイルのCSVセ?
302 *
303 * @param multi MultipartRequestオブジェク?
304 *
305 * @return ??ブルモ?
306 */
307 private DBTableModel makeDBTable( final MultipartRequest multi ) {
308
309 DBTableModel table = DBTableModelUtil.newDBTable();
310
311 table.init( names.length );
312
313 for( int i=0; i<names.length; i++ ) {
314 DBColumn dbColumn = getDBColumn( names[i] );
315 table.setDBColumn( i,dbColumn );
316 }
317
318 String[] values ; // 4.0.0.0 (2007/10/12)
319 List<String> prmNames = new ArrayList<String>();
320
321 // 5.7.6.3 (2014/05/23) ア??ロードファイルのCSVセ?
322 StringBuilder buf = new StringBuilder();
323
324 // 5.7.1.1 (2013/12/13) HTML5 ファイルア??ロード??選択?ultiple?対?
325 // String[] files = multi.getFilenames(); // 3.6.0.0 (2004/09/17)
326 UploadedFile[] files = multi.getUploadedFile();
327 for( int i=0; i<files.length; i++ ) {
328 // String name = files[i];
329 // File fin = multi.getFile(name);
330 // File fin = files[i].getFile();
331 // if( fin != null ) {
332 // String val = multi.getFilesystemName(name);
333 String name = files[i].getName(); // multiple対応では、キーがかぶることがある?
334 // String val = files[i].getFilesystemName();
335 // String val = files[i].getUploadFile().getPath(); // 5.7.1.2 (2013/12/20) zip対応で、UploadedFile のメソ?変更
336 String val = files[i].getUploadFile().getName(); // 5.7.3.0 (2014/02/07) 取得ファイル名が異なって??
337
338 // 5.7.6.3 (2014/05/23) ア??ロードファイルのCSVセ?
339 if( i==0 ) { buf.append( val ); }
340 else { buf.append( "," ).append( val ); } // カンマ結合で、最初だけ結合しな??
341
342 // "KEY","VALUE","ISFILE" の???タを作?します?
343 values = new String[] { name, val, "1" };
344 table.addColumnValues( values );
345 setRequestAttribute( name,val );
346 prmNames.add( name ); // 5.7.1.1 (2013/12/13) List に設定する?
347
348 String orgName = name + "_ORG" ;
349 // val = multi.getOriginalFileName(name); // 注意:取得???信?
350 val = files[i].getOriginalFileName(); // 注意:取得???信?
351
352 // "KEY","VALUE","ISFILE" の???タを作?します?
353 values = new String[] { orgName, val, "2" };
354 table.addColumnValues( values );
355 setRequestAttribute( orgName,val );
356 // }
357 }
358
359 // 5.7.6.3 (2014/05/23) ア??ロードファイルのCSVセ?
360 setRequestAttribute( UPLOAD_FILES,buf.toString() );
361
362 // "KEY","VALUE","ISFILE" の???タを作?します?
363 values = new String[] { "directory", fileURL, "0" };
364 table.addColumnValues( values );
365 setRequestAttribute( "directory",fileURL );
366
367 String[] params = multi.getParameterNames();
368 for( int i=0; i<params.length; i++ ) {
369 String name = params[i];
370 // 5.3.2.0 (2011/02/01) チェ?行?パラメーターはint配?側に変換
371 if ( HybsSystem.ROW_SEL_KEY.equals( name ) ) {
372 setRequestAttribute( name,multi.getIntParameters(name) );
373 }
374 else {
375 // 5.6.5.2 (2013/06/21) チェ?ボックス配?の値取得を??した、MultipartRequest のパラメータ値取?
376 String val = getParamVal( name,multi );
377 // String val = multi.getParameter(name);
378 // // "KEY","VALUE","ISFILE" の???タを作?します?
379 // if( "0".equals(val) ){ // 5.4.4.2 チェ?ボックス配?対応?
380 // String[] vals = multi.getParameters(name);
381 // if( vals != null && vals.length > 1 ) {
382 // for( int j=0; j<vals.length; j++ ) {
383 // if( "1".equals( vals[j] ) ) {
384 // val = "1";
385 // break;
386 // }
387 // }
388 // }
389 // }
390
391 values = new String[] { name, val, "0" };
392 table.addColumnValues( values );
393 setRequestAttribute( name,val );
394 prmNames.add( name ); // 5.7.1.1 (2013/12/13) List に設定する?
395 }
396 }
397
398 // 5.3.2.0 (2011/02/01) パラメーター名を保存する?
399 // 5.7.1.1 (2013/12/13) List に設定する?
400 // String[] names = new String[ files.length + params.length ];
401 // System.arraycopy( files, 0, names, 0, files.length );
402 // System.arraycopy( params, 0, names, files.length, params.length );
403 // setParameterNames( names );
404 setParameterNames( prmNames.toArray( new String[prmNames.size()] ) );
405
406 return table ;
407 }
408
409 /**
410 * ファイルア??ロード?実行結果?横持? DBTableModel に記述します?
411 *
412 * こ?処??、columns 属?を設定した?合?みとします?
413 *
414 * DBTableModel作?時に、指定?カラ??"_01"??_99"の添え字をレコードとして作?します?
415 * 現状は?KEY","VALUE","ISFILE" のカラ?、データを縦持ちで作?して?す?
416 * これを?横持で作?しますが、カラ??末尾に?_01"??_99" までの添え字を
417 * 持つ場合?、これをレコードと認識させます?
418 * 添え字がな??合?、カラ?け作?されます?カラ?と同じリクエストがあれば?
419 * すべてのレコードに同じ値がセ?されます?
420 *
421 * @og.rev 5.6.5.2 (2013/06/21) 新規作?
422 * @og.rev 5.6.6.1 (2013/07/12) 添え字がな??合?処??見直?
423 * @og.rev 5.7.1.2 (2013/12/20) zip対応で、UploadedFile のメソ?変更
424 * @og.rev 5.7.3.0 (2014/02/07) zip対応?修正で、取得ファイル名が異なって??
425 * @og.rev 5.7.6.3 (2014/05/23) ア??ロードファイルのCSVセ?
426 *
427 * @param multi MultipartRequestオブジェク?
428 *
429 * @return ??ブルモ?
430 */
431 private DBTableModel makeDBTableFromClms( final MultipartRequest multi ) {
432
433 DBTableModel table = DBTableModelUtil.newDBTable();
434
435 String[] clmNames = columns.split( "," );
436
437 table.init( clmNames.length );
438
439 // 値配??1行???
440 String[] rowVal = new String[clmNames.length];
441
442 // 5.7.1.1 (2013/12/13) HTML5 ファイルア??ロード??選択?ultiple?対?
443 UploadedFile[] files = multi.getUploadedFile();
444
445 List<String> prmNames = new ArrayList<String>();
446
447 for( int i=0; i<clmNames.length; i++ ) {
448 String clm = clmNames[i] ;
449 DBColumn dbColumn = getDBColumn( clm );
450 table.setDBColumn( i,dbColumn );
451
452 // 先に、カラ?と??するパラメータを?期?としてセ?しておきます?
453 String val = getParamVal( clm,multi );
454
455 // 5.6.6.1 (2013/07/12) ファイル名も同様に、あれ?初期値セ?しておきます?
456 if( val == null ) {
457 // 5.7.1.1 (2013/12/13) HTML5 ファイルア??ロード??選択?ultiple?対?
458 // val = multi.getFilesystemName( clm );
459 for( int j=0; j<files.length; j++ ) {
460 String nm = files[j].getName();
461 if( clm.equalsIgnoreCase( nm ) ) {
462 // val = files[j].getFilesystemName();
463 // val = files[i].getUploadFile().getPath(); // 5.7.1.2 (2013/12/20) zip対応で、UploadedFile のメソ?変更
464 val = files[i].getUploadFile().getName(); // 5.7.3.0 (2014/02/07) 取得ファイル名が異なって??
465 break; // 5.7.6.3 (2014/05/23) た?ん有ったほ?良??
466 }
467 }
468 }
469 // 5.7.1.1 (2013/12/13) getFilesystemName() の中に、newFile ?null の場合?、original を返す処?ある?
470 // if( val == null ) {
471 // // 5.7.1.1 (2013/12/13) HTML5 ファイルア??ロード??選択?ultiple?対?
472 //// val = multi.getOriginalFileName( clm ); // 注意:取得???信?
473 // for( int j=0; j<files.length; j++ ) {
474 // String nm = files[j].getName();
475 // if( clm.equalsIgnoreCase( nm ) ) {
476 // val = files[j].getOriginalFileName();
477 // break;
478 // }
479 // }
480 // }
481 rowVal[i] = ( val == null ) ? "" : val ;
482 }
483
484 // 5.7.6.3 (2014/05/23) ア??ロードファイルのCSVセ?
485 StringBuilder buf = new StringBuilder();
486
487 // String[] files = multi.getFilenames(); // 3.6.0.0 (2004/09/17)
488 for( int i=0; i<files.length; i++ ) {
489 // String name = files[i];
490 // File fin = multi.getFile(name);
491 String name = files[i].getName();
492 // File fin = files[i].getFile();
493 // if( fin != null ) {
494 // 5.6.6.1 (2013/07/12) 添え字がな??合?処??見直し?先にレコードを作?
495 String[] values = new String[clmNames.length];
496 System.arraycopy( rowVal,0,values,0,values.length ); // 行にセ?するに当たり?rowVal ?values にコピ?しておく?
497
498 // ファイル名を Attribute で使えるようにセ?しておく?
499 // String fval = multi.getFilesystemName(name);
500 // String fval = files[i].getFilesystemName();
501 // String fval = files[i].getUploadFile().getPath(); // 5.7.1.2 (2013/12/20) zip対応で、UploadedFile のメソ?変更
502 String fval = files[i].getUploadFile().getName(); // 5.7.3.0 (2014/02/07) 取得ファイル名が異なって??
503 setRequestAttribute( name,fval );
504 prmNames.add( name ); // 5.7.1.1 (2013/12/13) List に設定する?
505
506 // 5.7.6.3 (2014/05/23) ア??ロードファイルのCSVセ?
507 if( i==0 ) { buf.append( fval ); }
508 else { buf.append( "," ).append( fval ); } // カンマ結合で、最初だけ結合しな??
509
510 String orgName = name + "_ORG" ;
511 // String oval = multi.getOriginalFileName(name); // 注意:取得???信?
512 String oval = files[i].getOriginalFileName(); // 注意:取得???信?
513 setRequestAttribute( orgName,oval );
514
515 // ファイルのキーを?に、添え字を検索します?
516 int adrs = name.lastIndexOf( '_' ); // 添え字??_' で区?れます?
517 // 5.6.6.1 (2013/07/12) 添え字がな??合?処??見直し?後続??行う?
518 // if( adrs < 0 ) { continue; } // 添え字がな?
519 if( adrs > 0 ) {
520 String fnm = name.substring( 0,adrs ); // ファイル???
521 String sub = name.substring( adrs ); // 添え?アン??バ?含?
522
523 // String[] values = new String[clmNames.length];
524 // System.arraycopy( rowVal,0,values,0,values.length ); // 行にセ?するに当たり?rowVal ?values にコピ?しておく?
525
526 // カラ?で検索しながら、レコード単位になるよ?セ?して?ます?
527 for( int j=0; j<clmNames.length; j++ ) {
528 String clm = clmNames[j] ;
529 String nm = null;
530 String val = null;
531
532 if( fnm.equalsIgnoreCase( clm ) ) { // ファイル名カラ?_NEWファイル名も、この値にすでに変わって???
533 // nm = name;
534 // val = multi.getFilesystemName( nm );
535 val = fval;
536 }
537 else if( ( fnm + "_ORG" ).equalsIgnoreCase( clm ) ) { // ?ァイル名カラ?
538 // nm = name + "_ORG" ;
539 // val = multi.getOriginalFileName( name ); // 注意:取得???信?
540 val = oval;
541 }
542 else if( ( fnm + "_NEW" ).equalsIgnoreCase( clm ) ) { // 新ファイル名カラ?
543 nm = name + "_NEW" ;
544 val = multi.getParameter( nm );
545 }
546 else {
547 nm = clmNames[j] + sub; // sub は、アン??バ?含?え?
548 // 5.6.5.2 (2013/06/21) チェ?ボックス配?の値取得を??した、MultipartRequest のパラメータ値取?
549 val = getParamVal( nm,multi );
550 }
551 if( val != null ) { values[j] = val ; } // val ?null でな?き?みセ?します?
552 // setRequestAttribute( nm,val );
553 }
554 }
555 table.addColumnValues( values );
556 // }
557 }
558 // 5.7.6.3 (2014/05/23) ア??ロードファイルのCSVセ?
559 setRequestAttribute( UPLOAD_FILES,buf.toString() );
560
561 // Attribute で使えるようにセ?しておく?
562 setRequestAttribute( "directory",fileURL );
563
564 // Attribute で使えるようにセ?しておく?
565 String[] params = multi.getParameterNames();
566 for( int i=0; i<params.length; i++ ) {
567 String name = params[i];
568 // 5.3.2.0 (2011/02/01) チェ?行?パラメーターはint配?側に変換
569 if ( HybsSystem.ROW_SEL_KEY.equals( name ) ) {
570 setRequestAttribute( name,multi.getIntParameters(name) );
571 }
572 else {
573 // 5.6.5.2 (2013/06/21) チェ?ボックス配?の値取得を??した、MultipartRequest のパラメータ値取?
574 String val = getParamVal( name,multi );
575 setRequestAttribute( name,val );
576 prmNames.add( name ); // 5.7.1.1 (2013/12/13) List に設定する?
577 }
578 }
579
580 // 5.3.2.0 (2011/02/01) パラメーター名を保存する?
581 // 5.7.1.1 (2013/12/13) List に設定する?
582 // String[] names = new String[ files.length + params.length ];
583 // System.arraycopy( files, 0, names, 0, files.length );
584 // System.arraycopy( params, 0, names, files.length, params.length );
585 // setParameterNames( names );
586 setParameterNames( prmNames.toArray( new String[prmNames.size()] ) );
587
588 return table ;
589 }
590
591 /**
592 * チェ?ボックス配?の値取得を??した、MultipartRequest のパラメータ値取?
593 *
594 * ここでは、?MultipartRequest のパラメータ値を取得します?
595 * 値の取得で、チェ?ボックス配?の場合?、取得した?が?"0" の場合?み
596 * 配?でパラメータを取得し直し?"1" がな?ど?再度検索します?
597 * チェ?ボックスでは、チェ?時? "1" と、チェ?されなかった?合??
598 * hidden の "0" の両方の値が?列としてリクエストされるケースがある為です?
599 *
600 * @og.rev 5.6.5.2 (2013/06/21) 新規作?
601 *
602 * @param key MultipartRequest のパラメータ取得?ためのキー
603 * @param multi MultipartRequestオブジェク?
604 *
605 * @return チェ?ボックス配?を?慮したパラメータ値
606 */
607 private String getParamVal( final String key , final MultipartRequest multi ) {
608 String val = multi.getParameter( key );
609
610 if( "0".equals(val) ){ // 5.4.4.2 チェ?ボックス配?対応?
611 String[] vals = multi.getParameters( key );
612 if( vals != null && vals.length > 1 ) {
613 for( int j=0; j<vals.length; j++ ) {
614 if( "1".equals( vals[j] ) ) {
615 val = "1";
616 break;
617 }
618 }
619 }
620 }
621 return val ;
622 }
623
624 /**
625 * 【TAG】ファイルをア??ロードするディレクトリを指定しま?
626 * (初期値:FILE_URL[={@og.value org.opengion.hayabusa.common.SystemData#FILE_URL}])?
627 *
628 * @og.tag
629 * こ?属?で?される?レクトリに、ア??ロードされたファイルをセーブします?
630 * ?方法???常の fileURL 属?と同様に、?頭が?'/' (UNIX) また??文字目が?
631 * ":" (Windows)の場合?、指定?URLそ?ままの?レクトリに、そ?な??合??
632 * fileURL = "{@USER.ID}" と?すると、FILE_URL 属?で??フォル??下に?
633 * さらに、各個人ID別のフォル?作?して、そこにセーブします?
634 * (初期値:シス?定数のFILE_URL[={@og.value org.opengion.hayabusa.common.SystemData#FILE_URL}])?
635 *
636 * @og.rev 4.0.0.0 (2005/01/31) StringUtil.urlAppend メソ?の利用
637 * @og.rev 4.0.0.0 (2007/11/20) ?された?レクトリ名??が"\"or"/"で終わって???合に?/"を付加する?
638 * @og.rev 5.7.1.1 (2013/12/13) リクエスト変数が使えな?ラーを表示する?
639 * @og.rev 5.7.4.3 (2014/03/28) リクエスト変数が使えな??チェ?を行う?
640 *
641 * @param url ファイルURL
642 * @see org.opengion.hayabusa.common.SystemData#FILE_URL
643 */
644 public void setFileURL( final String url ) {
645 String furl = nval( getRequestParameter( url ),null );
646 if( furl != null ) {
647 char ch = furl.charAt( furl.length()-1 );
648 if( ch != '/' && ch != '\\' ) { furl = furl + "/"; }
649 fileURL = StringUtil.urlAppend( fileURL,furl );
650 }
651 // else if( url != null && url.startsWith( "{@" ) ) {
652 // String errMsg = "upload では、enctype=\"multipart/form-data\" のため、{@XXXX}形式?パラメータが使えません?
653 // + " fileURL=[" + url + "]" ;
654 // throw new HybsSystemException( errMsg ); // 5.7.1.1 (2013/12/13) リクエスト変数が使えな?ラー
655 // }
656 else {
657 chckReqParam( url,"fileURL" ); // 5.7.4.3 (2014/03/28) リクエスト変数が使えな??チェ?
658 }
659 }
660
661 /**
662 * 【TAG】最大転送サイズ(Byte)を指定しま?初期値:10485760)?
663 *
664 * @og.tag
665 * ?転送サイズを指定します?初期値は?0*1024*1024 = 10MB です?
666 * ??、Byte 単位で?します?
667 * 0,また?マイナスを指定することで、制限チェ?を外す?=無制限)事ができます?
668 *
669 * @og.rev 3.0.1.1 (2003/03/06) maxPostSize の設定バグ修正?
670 * @og.rev 5.6.5.3 (2013/06/28) コメント追??,また?マイナスで無制限?
671 * @og.rev 5.7.4.3 (2014/03/28) リクエスト変数が使えな??チェ?を行う?
672 *
673 * @param maxPS ?転送サイズ
674 */
675 public void setMaxPostSize( final String maxPS ) {
676 maxPostSize = nval( getRequestParameter( maxPS ),maxPostSize );
677
678 chckReqParam( maxPS,"maxPostSize" ); // 5.7.4.3 (2014/03/28) リクエスト変数が使えな??チェ?
679 }
680
681 /**
682 * 【TAG?通常は使?せん)結果のDBTableModelを?sessionに登録するとき?キーを指定しま?
683 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])?
684 *
685 * @og.tag
686 * 検索結果より、DBTableModelオブジェクトを作?します?これを?下流?viewタグ等に
687 * 渡す?合に??常は、session を利用します?そ?場合?登録キーです?
688 * query タグを同時に実行して、結果を求める?合?同?モリに配置される為?
689 * こ? tableId 属?を利用して、メモリ空間を?ます?
690 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])?
691 *
692 * @og.rev 5.7.4.3 (2014/03/28) リクエスト変数が使えな??チェ?を行う?
693 *
694 * @param id sessionに登録する時? ID
695 */
696 public void setTableId( final String id ) {
697 tableId = nval( getRequestParameter( id ),tableId );
698
699 chckReqParam( id,"tableId" ); // 5.7.4.3 (2014/03/28) リクエスト変数が使えな??チェ?
700 }
701
702 /**
703 * 【TAG?通常使?せん)ファイルを作?するとき?ファイル名をセ?します?
704 *
705 * @og.tag
706 * ファイルを作?するとき?ファイル名をセ?します?
707 * これは、?同時にア??ロードファイル名を変更する時に使用できません?
708 * 通常、ア??ロードされたファイル名を?する?合?ア??ロードするinput タグの
709 * name 属?に?する名称 ??"_NEW" と?リクエスト?を同時に送信すれば?
710 * ??関連付けて、ファイル名を更新します?
711 * そ?場合?クライアントより指定したファイル名?、name属???_ORG" と?
712 * リクエスト?として取得することが可能になります?
713 * name属? には、最終的に設定されたファイル名がセ?されて?す?
714 * ?れ?値も?{@name属???_ORG"} ??{@name属???_NEW"}として?
715 * ア??ロード?オリジナルと変更後?ファイル名を取得することが?来ます?
716 *
717 * 5.7.1.2 (2013/12/20) zip 対?
718 * filename 属?に?.zip" の拡張子?ファイル名を?した?合?、ア??ロードされた??のファイル?
719 * ZIP圧縮します?これは、ア??ロード後?処?なります?
720 * ZIP圧縮のオリジナルファイルは、そのまま残ります?
721 * なお?ZIPファイルは、useBackup属??true に設定しても?無関係に、上書きされます?
722 *
723 * 5.7.4.3 (2014/03/28) filename 属?のリクエスト変数対?
724 * filename 属?のみ、{@XXXX} のリクエスト変数が使えるようにします?
725 * 他?パラメータでは使えません?
726 * これは、multipart/form-data のリクエストでは、パート??処?しな?、リクエスト変数?
727 * 拾えな?、リクエスト変数は、この、upload タグ以降でのみ利用可能でした?
728 * zip対応と関連付けて、filename 属?のみ、利用できるように、MultipartRequest 側の処??込みます?
729 *
730 * @og.rev 3.5.4.2 (2003/12/15) ファイル名を?できるようにします?
731 * @og.rev 5.7.1.1 (2013/12/13) リクエスト変数が使えな?ラーを表示する?
732 * @og.rev 5.7.4.3 (2014/03/28) リクエスト変数を使えるようにします?
733 *
734 * @param fname ファイル?
735 */
736 public void setFilename( final String fname ) {
737 filename = nval( getReservedParameter( fname ),null ); // 予??み処?します?
738
739 // filename = nval( getRequestParameter( fname ),null );
740
741 // if( filename == null && fname != null && fname.startsWith( "{@" ) ) {
742 // String errMsg = "upload では、enctype=\"multipart/form-data\" のため、{@XXXX}形式?パラメータが使えません?
743 // + " filename=[" + fname + "]" ;
744 // throw new HybsSystemException( errMsg ); // 5.7.1.1 (2013/12/13) リクエスト変数が使えな?ラー
745 // }
746 }
747
748 /**
749 * 【TAG】DBTableModel作?時に、指定?カラ??"_01"??_99"の添え字をレコードとして作?します?
750 *
751 * @og.tag
752 * 現状は?KEY","VALUE","ISFILE" のカラ?、データを縦持ちで作?して?す?
753 * これを?横持で作?しますが、カラ??末尾に?_01"??_99" までの添え字を
754 * 持つ場合?、これをレコードと認識させます?
755 * アン??バ?がな??合?、カラ?け作?されます?カラ?と同じリクエストがあれば?
756 * すべてのレコードに同じ値がセ?されます?
757 * こ?処??、columns 属?を設定した?合?みとします?
758 *
759 * @og.rev 5.6.5.2 (2013/06/21) 新規作?
760 * @og.rev 5.7.4.3 (2014/03/28) リクエスト変数が使えな??チェ?を行う?
761 *
762 * @param clms DBTableModel作?時?カラ??(カンマ区???
763 */
764 public void setColumns( final String clms ) {
765 columns = nval( getRequestParameter( clms ),columns );
766
767 chckReqParam( clms,"columns" ); // 5.7.4.3 (2014/03/28) リクエスト変数が使えな??チェ?
768 }
769
770 /**
771 * 【TAG】ファイルア??ロード時に、すでに同名のファイルが存在した場合に、バ?ア??処?renameTo)するかど?[true/false]を指定しま?初期値:false)?
772 *
773 * @og.tag
774 * ファイルア??ロード時に、ア??ロード?に、同名?ファイルが存在した場合?、既存機?は、そのまま
775 * 置き換えて?したが?簡易バージョンア??機?として、useBackup="true" を指定すると、既存?ファイル?
776 * リネ??て、バ?ア??ファイルを作?します?
777 * バックア??ファイルは、ア??ロードフォル?基準として、_backup/ファイル?拡張子_処?刻のlong値.拡張?になります?
778 * オリジナルのファイル名(拡張子付)を残したまま?_処?刻のlong値" を追?、さらに、オリジナルの拡張子を追?ます?
779 * バックア??ファイルの形式??できません?
780 *
781 * 初期値は、互換性を持たせるため?false です?
782 *
783 * @og.rev 5.6.5.3 (2013/06/28) 新規作?
784 * @og.rev 5.7.4.3 (2014/03/28) リクエスト変数が使えな??チェ?を行う?
785 *
786 * @param flag ファイルア??ロード時に、バ?ア??処?renameTo)するかど?[true/false]を指?
787 */
788 public void setUseBackup( final String flag ) {
789 useBackup = nval( getRequestParameter( flag ),useBackup );
790
791 chckReqParam( flag,"useBackup" ); // 5.7.4.3 (2014/03/28) リクエスト変数が使えな??チェ?
792 }
793
794 /**
795 * リクエスト変数が使えな??チェ?を行います?
796 *
797 * upload では、enctype="multipart/form-data" のため、{@XXXX}形式?パラメータが使えません?
798 * 5.7.4.3 (2014/03/28) から、filename のみ利用可能としたことで、同様に利用できると
799 * 勘違?るケースに対応する為、すべてのパラメータにつ?チェ?を行います?
800 * ここでは、getRequestParameter( String ) の実行後?すぐに、isNull() 判定を行う事で?
801 * リクエスト変数の存在チェ?を行う事にして?す?
802 *
803 * @og.rev 5.7.4.3 (2014/03/28) リクエスト変数が使えな??チェ?を行う?
804 *
805 * @param org 引数のオリジナル値
806 * @param key エラーの発生した変数?
807 * @throws HybsSystemException パラメータが使用されて?場?
808 */
809 private void chckReqParam( final String org,final String key ) {
810 if( isNull() && org != null && org.contains( "{@" ) ) {
811 String errMsg = "upload では、enctype=\"multipart/form-data\" のため、{@XXXX}形式?パラメータが使えません?
812 + HybsSystem.CR
813 + " " + key + "=[" + org + "]" ;
814 throw new HybsSystemException( errMsg ); // リクエスト変数が使えな?ラー
815 }
816 }
817
818 /**
819 * タグの名称を?返します?
820 * 自??身のクラス名より?自動的に取り出せな?め?こ?メソ?をオーバ?ライドします?
821 *
822 * @og.rev 4.0.0.0 (2005/01/31) 新規追?
823 *
824 * @return タグの名称
825 */
826 @Override
827 protected String getTagName() {
828 return "upload" ;
829 }
830
831 /**
832 * こ?オブジェクト???表現を返します?
833 * 基本???目?使用します?
834 *
835 * @return こ?クラスの??表現
836 */
837 @Override
838 public String toString() {
839 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
840 .println( "VERSION" ,VERSION )
841 .println( "names" ,names )
842 .println( "ENCODE" ,ENCODE )
843 .println( "fileURL" ,fileURL )
844 .println( "filename" ,filename )
845 .println( "maxPostSize" ,maxPostSize)
846 .println( "tableId" ,tableId )
847 .println( "columns" ,columns ) // 5.6.5.2 (2013/06/21)
848 .println( "useBackup" ,useBackup ) // 5.6.5.3 (2013/06/28)
849 .println( "Other..." ,getAttributes().getAttribute() )
850 .fixForm().toString() ;
851 }
852 }