在网站中上传图片或者其他资源时,通常都会有一些特殊的要求,如文件大小、上传格式等。使用 Struts2 框架进行文件上传时,通过设置上传拦截器 FileUpload,同样可以实现这些功能。在 FileUpload 中,有三个属性可以设置,具体如下。
在项目的 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 文件,在该文件中列出了几乎所有的文件类型。读者可以通过文件扩展名找到相对应的文件类型。