[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 メーリングリストの案内