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