在web應用中,文件上傳似乎是很常見的,但是采用傳統的方法不但復雜而且難以控制,需要寫很多代碼,像控制文件大小、文件類型的過濾、存放目錄等等。這些復雜的問題在Struts2中已經不存在了,struts2默認使用common-fileupload實現文件的上傳。在struts.properties中我們可以看到:struts.multipart.parser=Jakarta 。下面我們就以Common-FileUpload來實現文件上傳。
首先,把commons-fileupload.jar和commons-io.jar拷貝到classpath路徑下。
建立一個上傳文件的頁面,upload.jsp。
上傳成功后的succ.jsp
然后編寫UploadAction.java
編寫struts.xml
編寫struts.properties
編寫國際化的資源文件mess.properties
在這里我沒有把調試的過程寫出來,這完全沒必要,網上已經有很多這方面的例子了,但是網上好多例子都有一個通病,那就是錯誤的信息實在是太多了,都是搜索引擎惹得禍。按照上面的步驟來做,很難成功!我按照上面的步驟來操作,發現兩個比較普遍的錯誤:
1) 不能上傳png和jpg類型的圖片。解決辦法可以參考上面的struts.xml。
2) 上傳過大的文件沒有提示信息,而是直接拋出下面的異常:
org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (2359629) exceeds the configured maximum (2097152)
為什么會出現這個錯誤?剛開始我還以為是Struts2的一個bug,于是我就開始研究是struts2內置的fileUpload攔截器,我研究了FileUploadInterceptor.java的源代碼并調試了半天依然不能解決這個問題,我都被它快折磨死了。最后我想起了在我們編寫struts.properties中有這么一句struts.multipart.parser=Jakarta,實際上這一句也可以不寫因為這是struts2為了支持文件上傳默認的。那么這個Jakarta到底是什么東西呢?實際上Jakarta實際上就是org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest類。打開JakartaMultiPartRequest.java的源代碼你會發現這個類實現了MultiPartRequest接口,在這個類封裝了對底層ServletFileUpload的操作,由于common-fileupload組件默認最大支持上傳文件的大小為2M,當我們上傳大于2M的文件時,就會出現上面的異常。是這個異常的發生導致了fileUpload攔截器沒有機會執行,所以我看到的是頁面沒有任何變化,也沒有任何提示信息,只是在控制臺打印出了上面的異常。解決的辦法在struts.properties文件中把struts.multipart.maxSize設置成一個比較大的值,也是就說maxSize遠遠要大于可能上傳文件的大小和fileUpload攔截器中maxinumSize的值,可參見上面的struts.xml和struts.properties文件。
posts - 146, comments - 143, trackbacks - 0, articles - 0
Copyright © flustar