[cubby-user:206] Re: [Cubby]ファイルアップロードでの例外補足について

BABA,Yasuyuki [E-MAIL ADDRESS DELETED]
2010年 6月 21日 (月) 16:53:57 JST


馬場です。

例外を発生させている 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 メーリングリストの案内