1

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

subir-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.propertiesjsp 表单的输入中定义的错误放入我。

全局属性

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

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

4

2 回答 2

5

我在 Google 中进行了更多搜索,发现了一个解释错误的博客(博客条目来自 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类。

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

@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或者为什么两个错误都是不同类型的错误(字段和操作错误)。

感谢大家的时间。

于 2012-07-04T07:22:01.897 回答
0

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

There's a pretty easy solution: In your struts.xml, increase the file size value of struts.multipart.maxSize,

  <constant name="struts.multipart.maxSize" value="50777216000" />
  <param name="maximumSize">15728640</param>

Keep param name="maximumSize" value less than struts.multipart.maxSize value,
As in above case, you will get your customised error defined in global.properties unless you exceed struts.multipart.maxSize limit..so try to keep struts.multipart.maxSize value to some high range.

于 2012-07-31T11:36:12.157 回答