最近在做一個小小的上傳功能竟被虐得體無完膚, 在使用tomcat內置的DiskFileUpload獲取前台jsp傳來的附件參數和其他表單參數, 竟然出現莫名其妙的亂碼問題, 即使tomcat的server.xml和web.xml和jsp頁面都做了UTF8 encode處理, 可還是有亂碼問題!
正當我想到用new String(fileItem.getName().getBytes("GBK"),"UTF-8");這個辦法臨時解決了亂碼問題(想不通怎么會有GBK, 項目所有文件都是UTF8編碼的), 好景不長, 又出現了神經問題: 漢字個數為奇數時(從第三位開始), GBK轉UTF8, 奇數位的漢字還是亂碼, 其他位數轉碼正常!
后來經過不停折騰和專研, 終於發現了治本的辦法: 使用Spring的CommonsMultipartResolver. 下面我想對這兩種上傳方式做一個對比:
1.傳統的Tomcat自帶組件DiskFileUpload上傳
1 DiskFileUpload diskFileUpload = new DiskFileUpload(); 2 List fileItems = diskFileUpload.parseRequest(request); 3 Iterator iter = fileItems.iterator(); 4 //查找multipart里面的表單值 5 for( ; iter.hasNext(); ) { 6 FileItem fileItem = (FileItem) iter.next(); 7 if( fileItem.isFormField() == true) { 8 //獲取表單數值 9 } 10 else { 11 //獲取附件對象 12 } 13 }
由於使用了multipart/formdata提交數據, spring mvc是無法輕易獲得輸入參數, 必須獲得fileItem列表, 在遞歸查找, 很麻煩!
2. Spring的CommonsMultipartResolver上傳
先在配置文件進行注入:
1 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" 2 p:defaultEncoding="UTF-8" 3 p:maxUploadSize="5400000" 4 p:uploadTempDir="hkrsImage/Appeal" > 5 </bean>
注意: 使用這個配置, 還必須在項目中引用common.fileupload組件.
然后在mvc 方法加上輸入參數@RequestParam("pic") MultipartFile picFile, 注意pic就是前台傳來的附件對象.
有了最起碼的CommonsMultipartResolver對象注入, 它可以讓mvc方法能夠正常映射前台頁面傳來的參數, 使用MultipartFile對象里的是transferTo方法能方便地保存附件到本地, 而且還能完美解決亂碼問題.