SpringMVC檔案上傳
阿新 • • 發佈:2018-12-19
- 情景:當表單上傳檔案的時候,介面卡無法通過引數繫結器儲存multipart/form-data型別的資料,所以SpringMVC需要對multipart型別的資料進行解析
- 前提:匯入上傳檔案的jar包,供解析器內部使用進行圖片上傳
檔案上傳步驟
- form表單支援檔案上傳:enctype="multipart/form-data" method="post"
- 在springmvc的核心配置檔案中配置multipart型別的檔案解析器
<!-- *高階功能-配置檔案上傳解析器 --> <bean id="multipartResolver" class = "org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 設定上傳檔案的最大尺寸為8MB --> <property name="maxUploadSize"> <value>8388608</value> </property> </bean>
- 在tomcat伺服器上新建一個虛擬目錄【對映本地物理目錄】來儲存上傳的檔案(先建立,後eclipse下啟動server測試)
- 測試:複製一張圖片到存放圖片的資料夾下,使用瀏覽器訪問
- 在controller的引數列表新增形參:MultipartFile file,用於繫結multipart檔案型別資料
- 在controller方法中先判斷file是否為空
- 然後編寫程式碼為上傳的檔案生成一個新的檔名,然後新增物理路徑生成新的file檔案
- 將儲存在file中的檔案寫入記憶體中,路徑即為新檔名的全路徑,這樣就將上傳的檔案儲存到了物理路徑下
- 上傳成功後,最終將新檔名寫入POJO中進行間接繫結,至此引數繫結真正完成!
@RequestMapping(value = "/login",method = {RequestMethod.GET,RequestMethod.POST}) public ModelAndView Login(Model modle,User user,MultipartFile file) throws Exception{ ModelAndView modelAndView = new ModelAndView(); //上傳檔案的原始名稱 String originalFilename = file.getOriginalFilename(); //切記要做多次判斷,否則不選擇圖片點選提交會報字串越界的錯誤 if(file != null && originalFilename != null && originalFilename.length() > 0 ){ //儲存檔案的物理路徑 String file_path = "D:\\tomcat_picture\\"; //生成新的檔名稱(格式:隨機數+原始檔名.後面的副檔名) String newFilename = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf(".")); //新檔案 java.io.File newFile = new java.io.File(file_path+newFilename); //將記憶體中上傳的檔案資料寫入磁碟,此時上傳的檔案都儲存在了物理目錄下!檔名為新檔案的名字! file.transferTo(newFile); //如果上傳成功,要將新的檔名寫入POJO屬性中進行間接儲存 //以後對該檔案的訪問和獲取,都將通過新的檔名進行! user.setUserFile(newFilename); } modelAndView.setViewName("login"); return modelAndView; }
附錄:
注意:
- 檔案的物理目錄一般分級建立,目的是提高IO效能,一般採用日期進行分級建立
- 同樣也要保持JSP頁面<input type = "file" name="file">和形參名file一致
- 程式測試沒有問題,如果無法上傳一般情況是建立的虛擬目錄和物理目錄不能對應,返回繼續除錯!
- JSP顯示:<img src="/pic/${u.userFile}" width=100 height=100>