Struts2实现文件上传限制大小和类型

在网站中上传图片或者其他资源时,通常都会有一些特殊的要求,如文件大小、上传格式等。使用 Struts2 框架进行文件上传时,通过设置上传拦截器 FileUpload,同样可以实现这些功能。

在 FileUpload 中,有三个属性可以设置,具体如下。
  • maximumSize:上传文件的最大长度(以字节为单位),默认值为 2MB。
  • allowedTypes:允许上传文件的类型,各类型之间以逗号分隔。
  • allowedExtensions:允许上传文件的扩展名,各扩展名之间以逗号分隔。

在项目的 struts.xml 中覆盖这三个属性即可对上传的文件大小和类型进行限制。修改《Struts2单个文件上传实例》中的 struts.xml 文件,在 FileUploadAction 中添加拦截器,如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <!--设置文件上传允许最大值为100MB-->
    <constant name="struts.multipart.maxSize" value="10485760"/>
    <package name="struts2" namespace="/" extends="struts-default">
        <action name="fileUpload" class="com.mengma.action.FileUploadAction">
            <result name="success">/result.jsp</result>
            <!-- 定义上传出错要跳转的页面 -->
            <result name="input">/fileUpload.jsp</result>
            <interceptor-ref name="defaultStack"><!--引用拦截器 -->
                <param name="fileUpload.maximumSize">4194304</param><!-- 设置每一个action允许的上传文件的大小 -->
                <!-- 当下面两个配置同时存在时,要满足下面两个条件,才能上传 -->
                <param name="fileUpload.allowedExtensions">.txt,.doc,.jpg</param>
                               <!-- 设置上传文件允许的后缀名,多个使用逗号分开 -->
                <param name="fileUpload.allowedTypes">
                    text/plain,application/msword,image/jpeg
                </param><!--设置上传允许的文件的mimeType类型,多个使用逗号分开 -->
            </interceptor-ref>
        </action>
    </package>
</struts>
上述代码中,首先通过设置常量 struts.multipart.maxSize 将允许上传文件的最大值设置为 10MB(Struts2 默认大小为 2MB),然后增加了上传文件出错时的跳转页面 fileUpload.jsp。

最后通过设置 FileUpload 拦截器的三个属性,分别将上传文件的最大值设置为 4MB,上传文件的扩展名设置为 txt、doc 和 jpg,上传文件的扩展名类型设置为 text/plain、application/msword 和 image/jpeg。

重新发布项目并访问 fileUpload.jsp 页面,在所允许的类型中选择一个文件大小超过 4MB 的文件上传时,浏览器页面的显示结果如图 1 所示。

从图 1 中可以看出,页面中提示了文件过大的英文错误信息,由于设定的允许最大值是 4MB,当上传的文件大小超过此数值时,就会报出此错误。

当上传一个不符合所设置的文件类型的文件(如 PDF 文件)时,浏览器页面的显示结果如图 2 所示。

上传文件超过设定值
图 1  上传文件超过设定值

上传文件类型不符合设定值
图 2  上传文件类型不符合设定值

从图 2 中可以看出,当上传的文件类型与设定值不匹配时,将提示上传文件类型不被允许的信息。

注意:allowedExtensions 的配置和 allowedTypes 的配置既可以单独配置也可以同时配置,当两个配置同时存在时,要同时满足这两个条件才能上传文件。对于文件的扩展名所对应的文件类型,读者可以打开 Tomcat 目录下的 conf 文件夹,找到其中的 web.xml 文件,在该文件中列出了几乎所有的文件类型。读者可以通过文件扩展名找到相对应的文件类型。