最近在項目中上傳文件時又出現了常見的異常信息:
java.lang.ClassCastException: net.bull.javamelody.JspWrapper$HttpRequestWrapper3 cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest
一、排查原因所在
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
對象request是HttpServletRequest的對象,提示了造型cast失敗。
二、問題解決
回顧了之前解決問題的經驗,確定原因在於表單沒有添加 enctype="multipart/form-data"
我們如要使用springmvc的MultipartFile接收前端頁面上傳,需要表單設置屬性 enctype="multipart/form-data"。

表單中enctype="multipart/form-data"的意思,是設置表單的MIME編碼。
默認情況,這個編碼格式是application/x-www-form-urlencoded,不能用於文件上傳;只有使用了multipart/form-data,才能完整的傳遞文件數據,進行下面的操作。
三、表單enctype屬性
HTML表單如何打包數據文件是由enctype這個屬性決定的。enctype有以下幾種取值:
application/x-www-form-urlencoded在發送前編碼所有字符(默認)(空格被編碼為’+’,特殊字符被編碼為ASCII十六進制字符)multipart/form-data不對字符編碼。在使用包含文件上傳控件的表單時,必須使用該值。text/plain空格轉換為 “+” 加號,但不對特殊字符編碼。
默認enctype=application/x-www-form-urlencoded,所以表單的內容會按URL規則編碼,然后根據表單的提交方法:
- method=’get’ 編碼后的表單內容附加在請求連接后
- method=’post’ 編碼后的表單內容作為post請求的正文內容
