[cubby-user:207] Re: [Cubby]ファイルアップロードでの例外補足について
Hitoshi Kuroyanagi
[E-MAIL ADDRESS DELETED]
2010年 6月 21日 (月) 19:43:36 JST
馬場様 お世話になっております。 黒柳です。
> 例外を発生させている MultipartRequestParser を置き換えるのが対応しやすい
> と思います。
早速のレスポンスありがとうございました、ご提案の通り実装してみて
バリデーションでしっかり補足できたことを確認いたしました。
詳細に渡りコードの提示までいただきありがとうございました。
2010年6月21日16:53 BABA,Yasuyuki <[E-MAIL ADDRESS DELETED]>:
> 馬場です。
>
> 例外を発生させている MultipartRequestParser を置き換えるのが対応しやすい
> と思います。
>
> 1. 以下のように MultipartRequestParser を継承した独自の RequestParser を
> 作成し、RequestParseException をキャッチ、原因がファイルサイズが制限を超
> えたことを示す例外(FileUploadBase.SizeException)なら、リクエストの属性に
> エラーが発生したことを示す印(ここでは"fileUploadError"という属性)を設定
> する。
> --------------------------------
> public class MyMultipartRequestParser extends MultipartRequestParser {
> @Override
> public Map<String, Object[]> getParameterMap(
> HttpServletRequest request) {
> try {
> return super.getParameterMap(request);
> } catch (RequestParseException e) {
> Throwable cause = e.getCause();
> if (cause instanceof FileUploadBase.FileSizeLimitExceededException) {
> Map<String, Object[]> parameterMap
> = new HashMap<String, Object[]>();
> parameterMap.put("fileUploadError", new Object[] { cause });
> return parameterMap;
> } else {
> throw e;
> }
> }
> }
> }
> --------------------------------
>
> 2.app-cubby.dicon などでリクエストのパーサーを指定しているところがありま
> すので、そこを新しく作成したクラスに置き換える。
> 変更前:
> <component name="multipartRequestParser"
> class="org.seasar.cubby.controller.impl.MultipartRequestParser" />
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 変更後:
> <component name="multipartRequestParser" class="MyMultipartRequestParser" />
> ~~~~~~~~~~~~~~~~~~~~~~~~
>
> 3.バリデーションのいちばん最初に時に1.で指定したリクエストの属性をチェッ
> クしてエラーを出力する。
> --------------------------------
> add(new ValidationRule() {
> public void apply(Map<String, Object[]> params, Object form,
> ActionErrors errors) throws ValidationException {
> Object[] fileUploadErrors = params.get("fileUploadError");
> if (fileUploadErrors != null && fileUploadErrors.length > 0) {
> throw new ValidationException("ファイルサイズが制限を越えていま
> す。", "file");
> }
> }
> });
> --------------------------------
>
>
>
> すこし面倒ですが、以上のような対応がよいと思います。いかがでしょう?
>
> また、この例外が発生するときにはリクエストのパラメータを取得できないの
> で、注意が必要です。そのため、上記の例ではバリデーションの最初にファイル
> サイズのエラーかどうかを判断しています。
>
>
>
> (2010年06月21日 15:35), Hitoshi Kuroyanagi wrote:
>> Cubbyでの案件を始めてみて、試行錯誤しながら進めております。
>>
>> Cubbyでのファイルアップロードにおいて、ファイルサイズの制限を超えた際に例外が発生するのですが
>> この例外をアクションクラス内で補足し、画面内にエラーメッセージを表示しようとしても補足ができず
>> 困っております。
>> Cubbyは 2.0.9を用い、
>> ファイルアップロードにおいてはCubby-Tipsにあるようにorg.apache.commons.fileupload.FileItem
>> で受け取りを行い app-cubby.diconの fileSizeMaxプロパティに上限サイズ値を設定しております。
>>
>> 何か方法がありましたら、ご教示ください。
>>
>> 例外時には下記のメッセージが表示されます。
>> javax.servlet.ServletException:
>> org.seasar.cubby.controller.RequestParseException: ファイルのアップロードに失敗しました
>> org.seasar.cubby.filter.CubbyFilter.doFilter(CubbyFilter.java:184)
>> org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79)
>> org.seasar.framework.container.hotdeploy.HotdeployFilter.doHotdeployFilter(HotdeployFilter.java:99)
>> org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:67)
>> org.seasar.cubby.filter.EncodingFilter.doFilter(EncodingFilter.java:176)
>> 原因
>>
>> org.seasar.cubby.controller.RequestParseException: ファイルのアップロードに失敗しました
>> org.seasar.cubby.controller.impl.MultipartRequestParser.getMultipartParameterMap(MultipartRequestParser.java:130)
>> org.seasar.cubby.controller.impl.MultipartRequestParser.getParameterMap(MultipartRequestParser.java:95)
>> org.seasar.cubby.spi.impl.AbstractRequestParserProvider.getParameterMap(AbstractRequestParserProvider.java:59)
>> org.seasar.cubby.filter.CubbyFilter.parseRequest(CubbyFilter.java:414)
>> org.seasar.cubby.filter.CubbyFilter$RequestProcessingInvocationImpl.proceed(CubbyFilter.java:475)
>> org.seasar.cubby.filter.CubbyFilter$RequestProcessingInvocationImpl.proceed(CubbyFilter.java:424)
>> org.seasar.cubby.plugin.AbstractPlugin.invokeRequestProcessing(AbstractPlugin.java:106)
>> org.seasar.cubby.filter.CubbyFilter$RequestProcessingInvocationImpl.proceed(CubbyFilter.java:472)
>> org.seasar.cubby.filter.CubbyFilter$RequestProcessingInvocationImpl.proceed(CubbyFilter.java:424)
>> org.seasar.cubby.plugin.AbstractPlugin.invokeRequestProcessing(AbstractPlugin.java:106)
>> org.seasar.cubby.filter.CubbyFilter$RequestProcessingInvocationImpl.proceed(CubbyFilter.java:472)
>> org.seasar.cubby.filter.CubbyFilter$RequestProcessingInvocationImpl.proceed(CubbyFilter.java:424)
>> org.seasar.cubby.plugin.AbstractPlugin.invokeRequestProcessing(AbstractPlugin.java:106)
>> org.seasar.cubby.filter.CubbyFilter$RequestProcessingInvocationImpl.proceed(CubbyFilter.java:472)
>> org.seasar.cubby.filter.CubbyFilter$RequestProcessingInvocationImpl.proceed(CubbyFilter.java:424)
>> org.seasar.cubby.filter.CubbyFilter.processRequest(CubbyFilter.java:400)
>> org.seasar.cubby.filter.CubbyFilter.doFilter(CubbyFilter.java:177)
>> org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79)
>> org.seasar.framework.container.hotdeploy.HotdeployFilter.doHotdeployFilter(HotdeployFilter.java:99)
>> org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:67)
>> org.seasar.cubby.filter.EncodingFilter.doFilter(EncodingFilter.java:176)
>> _______________________________________________
>> cubby-user mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/cubby-user
>
>
> --
> BABA,Yasuyuki
> [E-MAIL ADDRESS DELETED]
> _______________________________________________
> cubby-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/cubby-user
>
cubby-user メーリングリストの案内