为什么错误“file.too.large”没有在jsp中显示(正确)?

时间:2012-07-03 11:32:16

标签: java file-upload struts2 validation

我有一个应用程序可以让你上传一些照片。我有一个带有表单的jsp页面,用于选择要上传的照片:

苏比尔-foto.jsp

...
<s:form action="SubirFoto" method="post" enctype="multipart/form-data" theme="bootstrap">
   <s:file name="foto" label="Foto" />
   <s:submit value="Upload" align="center" />
</s:form>
...

我希望使用此表单,用户只能上传某些类型的文件(如jpg,gif ...),并且不允许用户上传大小超过2 MB的照片。

struts.xml中

<action
        name="SubirFoto"
        class="impl.redex.presentation.profile.upload.SubirFotosAction">
        <interceptor-ref name="fileUpload">
            <param name="maximumSize">2097152</param>
            <param name="allowedTypes">
                image/png,image/gif,image/jpeg,image/pjpeg
            </param>
        </interceptor-ref>
        <interceptor-ref name="dentroStack"></interceptor-ref>
        <result name="success">/WEB-INF/jsps/foto/foto-subida.jsp</result>
        <result name="input">/WEB-INF/jsps/foto/subir-foto.jsp</result>
</action>

除了一件事,文件上传工作完美。如果满足要求,我可以上传任何照片。如果我尝试上传不是照片的文件(例如,纯文本文件),应用程序会将我在global.properties中定义的错误放在jsp形式的输入中。

global.properties

struts.messages.error.uploading - No se ha podido subir el fichero
struts.messages.error.file.too.large - El fichero es demasiado grande. El tamaño máximo es de 2MB.
struts.messages.error.content.type.not.allowed - Tipo de fichero no aceptado. Sólo es válido si la foto \
está en formato jpg/jpeg, gif o png.

问题是,如果我尝试上传大于2 MB的图片,应用程序会将我重定向到 subir-foto.jsp ,但它不会在jsp页面中出现任何错误。

我已经尝试了一下,如果我将<s:actionerror />放在subir-foto.jsp中,当我上传大照片时,它会出现:

the request was rejected because its size (17224595) exceeds the configured maximum (2097152)

如您所见,这不是我在global.properties中定义的错误。

为什么这两个不同的错误不是字段错误?这是bootstrap插件的问题吗?或者它是Struts2的错误?难道我做错了什么?感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:5)

我在谷歌搜索更多,我发现了一个解释错误的博客(博客文章来自2008年,我使用的是Struts 2.3.4):

http://blog.bielu.com/2008/09/solution-to-struts2-upload-file-error.html

我总结了如何解决我的问题。问题是消息the request was rejected because its size ...在其中一个Struts2类中是硬编码的。

  

这个问题至少有三个解决方案(所有这些都是痛苦的屁股):一个是重新实现org.apache.struts2.dispatcher.multipart.MultiPartRequest类;第二个是重新实现org.apache.struts2.interceptor.FileUploadInterceptor课程。

第三个是在FileUpload类中放置一个validate方法。

@Override
public void validate() {
    boolean error = false;

    Collection<?> tmp = getActionErrors();

    for (Object o : tmp) {
        if (o.toString().contains(
                "the request was rejected because its size")) {

            if (!error) {
                addFieldError("foto",
                        "El tamaño de la foto es muy grande (Máximo: 2MB)");
                error = true;
            }
        }
    }

}

无论如何,我仍然无法理解为什么我定义的消息不起作用,因为在我搜索的所有网站中都告诉我覆盖struts.messages.error.file.too.large或者为什么两个错误都有不同类型的错误(字段和动作错误)。

感谢大家的时间。

答案 1 :(得分:0)

首先,如果您尝试上传的文件超过为struts.multipart.maxSize指定的文件大小,则会出现此错误

有一个非常简单的解决方案: 在struts.xml中,增加struts.multipart.maxSize,

的文件大小值
  <constant name="struts.multipart.maxSize" value="50777216000" />
  <param name="maximumSize">15728640</param>

保持param name =“maximumSize”值小于 struts.multipart.maxSize值,
与上面的情况一样,除非你超过struts.multipart.maxSize limit,否则你将获得在global.properties中定义的自定义错误。所以尝试将struts.multipart.maxSize值保持在某个高范围。