Struts2上傳文件的最大Size的設置
struts2中文件上傳的二個限製,一個是struts.multipart.maxSize,如果不設置,struts2 的核心包下的default.properties文件裏有默認的大小設置struts.multipart.maxSize=2097152,即2M. 這是struts2文件上傳的第一道關。
第二道關是inteceptor中的maximumSize. 當真實的文件大小能通過第一道關時.針對不同的action中配置的inteceptor,maximumSize才能發揮相應的攔截作用.
比如struts.multipart.maxSize=50M
actionA中inteceptorA的maximumSize=30M
actionB中inteceptorB的maximumSize=10M
struts.multipart.maxSize=50M對於inteceptorA,B都會起到第一關的作用.
而inteceptorA和inteceptorB可以在通過第一關之後,根據自己的業務定製各自針對攔截器起作用的maximumSize
如果真實的文件>50M. 拋出會拋出the request was rejected because its size (XXXX) exceeds the configured maximum (XXXX)異常,他是不能被國際化的,因為這個信息是commons-fileupload組件拋出的,是不支持國際化這信息。
源碼可以看struts2.2 org.apache.commons.fileupload.FileUploadBase.java
如果InteceptorA上傳的是40M的真實文件
那麼此時攔截器InteceptorA會訪問國際化信息:struts.messages.error.file.too.larges對應的值.當且僅當上傳文件<=30M的時候,InteceptorA才會成功上傳。
下麵是解決struts.multipart.maxSize提示信息不友好的問題.
當超過50M時.commons-fileupload拋出運行時異常
struts2會把這個異常看到是action級別的異常.所以會將異常信息
the request was rejected because its size (XXXX) exceeds the configured maximum (XXXX)寫到actionError裏麵。
我們需要做的就是在action裏覆蓋addActionError方法。
@Override
public void addActionError(String anErrorMessage)
{
//改從國際化裏取值
if (anErrorMessage.startsWith("the request was rejected because its size"))
{
super.addActionError(getText("struts.multipart.maxSize.limit"));
}
else
{
super.addActionError(anErrorMessage);
}
}
相應的配置文件
struts.multipart.maxSize.limit=係統上傳的文件最大為50M
struts.messages.error.file.too.larges=新廣告批量上傳的文件最大為5M
struts.messages.error.content.type.not.allowed=上傳的文件格式目前僅支持xls格式
struts.messages.error.uploading=上傳文件失敗
struts.messages.invalid.token=您已經提交了表單,請不要重複提交。
fileupload.filenums.exceed=已經有超過5個文件在運行,請稍候再試
filedownload.rows.exceed=由於您選擇的廣告組內廣告數量太多,請分組下載
accountNotExist=客戶不存在
invalidTask=無效的任務
注意,由於inteceptor中途返回,原來頁麵上輸入的其他文本內容也都不見了,也就是說params注入失敗。
因為這個異常是在文件上傳之前捕獲的,文件未上傳,同時params也為注入,所以這時最好重定向到一個jsp文件,提示上傳失敗,然後重寫填寫相應信息。
解決辦法:最好跳到一個專門顯示錯誤的頁.而不要返回操作頁。
注意,攔截器所謂的同名配置覆蓋,是重複執行的,比如defaultStack中是包含fileUpload,token的. 如果將<interceptor-ref name="defaultStack" />放到顯示定義的攔截器之後,會覆蓋顯示定義的攔截器.。
<action name="BatchMIADOperation!*" method="{1}">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="fileUpload">
<param name="maximumSize">5242880</param>
<!--
<param name="allowedTypes">
application/vnd.ms-excel
</param>
-->
</interceptor-ref>
<interceptor-ref name="token">
<param name="excludeMethods">
init,search,updateBatchCpcMatch,batchExportMIAD,downloadWhenError
</param>
</interceptor-ref>
<result name="input">
/WEB-INF/jsp/multiidea/batchad/BatchMIAD.jsp
</result>
<result name="success">
/WEB-INF/jsp/multiidea/batchad/BatchMIAD.jsp
</result>
<result name="invalid.token">
/WEB-INF/jsp/multiidea/batchad/BatchMIAD.jsp
</result>
</action>
Struts.xml相關配置如下:
<constant name="struts.multipart.maxSize" value="9000000"/>
<action name="FileUpload" >
<result name="success">/FileUploadResult.jsp</result>
<result name="input">/FileUpload.jsp</result>
<interceptor-ref name="fileUpload">
<param name="maximumSize">500000</param>
<param name="allowedTypes">application/vnd.ms-powerpoint</param>
</interceptor-ref>
<interceptor-ref name="defaultStack" />
</action>
<action name="FileUpload" >
<result name="success">/FileUploadResult.jsp</result>
<result name="input">/FileUpload.jsp</result>
<interceptor-ref name="fileUpload">
<param name="maximumSize">300000</param>
<param name="allowedTypes">application/vnd.ms-powerpoint</param>
</interceptor-ref>
<interceptor-ref name="defaultStack" />
</action>
原帖地址:https://www.cnblogs.com/highriver/archive/2011/06/01/2065557.html
最後更新:2017-04-02 22:16:33