Action:
/** * 当上传文件大小大于struts.multipart.maxSize提示时, * 客户端会出现如下错误: * "the request was rejected because its size (4501994) * exceeds the configured maximum (2097152)"。 * 此信息在commons-fileupload.jar, * org.apache.commons.fileupload.FileUploadBase源代码中第904行。 * * 重写addActionError()以替换默认信息。 */ @Override public void addActionError(String anErrorMessage) { //这里要先判断一下,是我们要替换的错误,才处理 if (anErrorMessage.startsWith("the request was rejected because its size")) { //这些只是将原信息中的文件大小提取出来。 Matcher m = Pattern.compile("\\d+").matcher(anErrorMessage); String s1 = ""; if (m.find()) s1 = m.group(); String s2 = ""; if (m.find()) s2 = m.group(); //偷梁换柱,将信息替换掉 // super.addActionError("你上传的文件(" + s1 + ")超过允许的大小(" + s2 + ")"); super.addActionError("您上传的附件过大,请确保单次所上传的附件大小总和没有超过20兆!"); isExceedMaximum=true; } else {//不是则不管它 super.addActionError(anErrorMessage); } }
jsp:
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@taglib uri="/struts-tags" prefix="s"%> <html> <body> <!--fielderror--> <s:if test="hasFieldErrors()"> <s:iterator value="fieldErrors"> <s:iterator value="value" status="statu"> <!-- //field的错误消息是List 因此还需要迭代一次 --> <s:set name="index" value="#statu.index"/> <s:set name="msg" value="#msg+value.get(#request.index).toString()==null||#msg+value.get(#request.index).toString()=='null'?'':#msg+value.get(#request.index).toString()+'\\\n'"/><!-- 关键代码 不过开始时有null前缀未去掉 -- > </s:iterator> </s:iterator> </s:if> <!--actionerror --> <s:if test="hasActionErrors()"> <s:iterator value="actionErrors"> <script language="JavaScript"> alert("<s:property escape="false"/>") </script> </s:iterator> </s:if> <!-- actionmessage --> <s:if test="hasActionMessages()"> <s:iterator value="actionMessages"> <script> alert("<s:property escape="false"/>") </script> </s:iterator> </s:if> <!-- 打印转换好格式的fielderror信息 --> <s:if test="#msg.length()>0"> <script language="JavaScript"> // alert('<s:property escape="false" value="#msg"/>') alert("可能资金格式不是数字,请确认!"); </script> </s:if> <script language="JavaScript"> history.back(); </script> </body> </html>
struts2.xml actionl配置:
如果action中默认的拦截器栈包含fileupload拦截器,就不要另外配置。如myStack,defaultStack。否则addActionError()会多执行一次,页面“您上传的附件过大,请确保单次所上传的附件大小总和没有超过20兆!"的提示会alert2次;
全局大小配置:
struts.xml
<constant name= "struts.multipart.maxSize" value="20971520" />
”