嚴重: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause java.lang.NullPointerException
使用input上傳文件時候出錯,因為在form里提交了圖文件,需要進行二進制編碼,而我卻少了這部分,即enctype="multipart/form-data"。更改后無錯。
表單中enctype="multipart/form-data"的意思,是設置表單的MIME編碼。
默認情況,這個編碼格式是application/x-www-form-urlencoded,不能用於文件上傳;
只有使用了multipart/form-data,才能完整的傳遞文件數據,進行下面的操作。
enctype="multipart/form-data"是上傳二進制數據,form里面的input的值以2進制的方式傳過去。
核心代碼如下:
jsp:
<form action="ManagerUpdate" onsubmit="return checkPwd()" enctype="multipart/form-data" method="post" > <div> <input type="hidden" value="${manager.id}" name="id"> </div> <div class="sign-u" style="margin-bottom: 20px"> <span> <img src="<%=path %>/upload/${manager.pic}" onerror="this.src='<%=path %>/upload/manager.png'" style="width: 20%;height: 20%;margin-left: 15%;border: 2px solid black"> </span> <label><input type="file" name="file" id="file" style="display: none" autocomplete="off" /><strong style="color: #01AAED;"> 上傳頭像</strong></label> <div class="clearfix"> </div> </div> </form>
Controller:
@RequestMapping(value = "ManagerUpdate") public String ManagerUpdate(Manager manager,MultipartFile file,HttpServletRequest request) throws IOException { //處理流業務 String path = request.getServletContext().getRealPath("/upload");//虛擬路徑 File dir = new File(path);//把虛擬路徑存儲到流中, dir.mkdirs();//查詢是否存在此文件夾,如果存在無操作,如果不存在這里自動創建; String srcName = file.getOriginalFilename();//獲取流中的文件名稱 File dest = new File(dir, srcName);//spring自動封裝的流上傳函數 file.transferTo(dest);//文件上傳 manager.setPic(srcName); boolean b = managerservice.updateManager(manager); request.setAttribute("b",b); return "redirect:ManagerShow"; }
學習鏈接:https://www.iteye.com/blog/zkliqiang-779285