SpringMVC中使用CommonsMultipartResolver進行文件上傳


概述:

CommonsMultipartResolver是基於Apache的Commons FileUpload來實現文件上傳功能的。所以在項目中需要相應的jar文件。

FileUpload版本要求1.2及以上。相應的gradle配置:

"commons-fileupload:commons-fileupload:1.2.2"
  • 1

上傳方法的實現

1. 代碼方式

直接在controler中new一個CommonsMultipartResolver。

@Controller @RequestMapping(value = "/file") public class FileController { @RequestMapping(value = "/commUploadA") @ResponseBody public JSONObject commUploadA(HttpServletRequest request) { JSONObject json = new JSONObject(); json.put("succ", false); try { //直接new一個CommonsMultipartResolver CommonsMultipartResolver cmr = new CommonsMultipartResolver(request.getServletContext()); cmr.setDefaultEncoding("utf-8"); cmr.setMaxInMemorySize(40960); cmr.setMaxUploadSize(10485760000L); if (cmr.isMultipart(request)) { MultipartHttpServletRequest multipartRequest = cmr.resolveMultipart(request); MultipartFile file = multipartRequest.getFile("uploadFile");// 與頁面input的name相同 File imageFile = new File("d:/upload1.jpg");// 上傳后的文件保存目錄及名字 file.transferTo(imageFile);// 將上傳文件保存到相應位置 json.put("succ", true); return json; } } catch (Exception e) { e.printStackTrace(); } return json; } }

2. Xml方式

通過spring配置一個名為”multipartResolver”的bean。

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="utf-8"></property> <property name="maxUploadSize" value="10485760000"></property> <property name="maxInMemorySize" value="40960"></property> </bean>

controller中的方法做相應修改。

@Controller @RequestMapping(value = "/file") public class FileController { @RequestMapping(value = "/commUploadB") @ResponseBody public JSONObject commUploadB(MultipartHttpServletRequest request) {//參數類型不同 JSONObject json = new JSONObject(); json.put("succ", false); try { MultipartFile file = request.getFile("uploadFile");// 與頁面input的name相同 File imageFile = new File("d:/upload2.jpg");// 上傳后的文件保存目錄及名字 file.transferTo(imageFile);// 將上傳文件保存到相應位置 json.put("succ", true); return json; } catch (Exception e) { e.printStackTrace(); return json; } } }

 

 

兩種方法的區別:

  1. 將CommonsMultipartResolver的實例化由代碼實現改為了xml配置實現。
  2. 方法中的參數類型由HttpServletRequest變為了MultipartHttpServletRequest。

而上傳的獲取和保存邏輯沒有變化。

注意:

在使用xml方式時,bean的名字必須為:multipartResolver。可在org.springframework.web.servlet.DispatcherServlet中找到原因:

public class DispatcherServlet extends FrameworkServlet { /** Well-known name for the MultipartResolver object in the bean factory for this namespace. */ public static final String MULTIPART_RESOLVER_BEAN_NAME = "multipartResolver"; ...... /** * Initialize the MultipartResolver used by this class. * <p>If no bean is defined with the given name in the BeanFactory for this namespace, * no multipart handling is provided. */ private void initMultipartResolver(ApplicationContext context) { try { this.multipartResolver = context.getBean(MULTIPART_RESOLVER_BEAN_NAME, MultipartResolver.class); if (logger.isDebugEnabled()) { logger.debug("Using MultipartResolver [" + this.multipartResolver + "]"); } } catch (NoSuchBeanDefinitionException ex) { // Default is no multipart resolver. this.multipartResolver = null; if (logger.isDebugEnabled()) { logger.debug("Unable to locate MultipartResolver with name '" + MULTIPART_RESOLVER_BEAN_NAME + "': no multipart request handling provided"); } } } ...... }

簡要分析CommonsMultipartResolver

CommonsMultipartResolver實現接口org.springframework.web.multipart.MultipartResolver,主要作用是將HttpSerlvetRequest封裝成MultipartHttpServletRequest。

public interface MultipartResolver { ...... MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException; ...... }

具體的封裝方法參考CommonsMultipartResolver對resolveMultipart的實現:

org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(javax.servlet.http.Ht


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM