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