SpringMVC使用MultipartFile上傳檔案
1. MultipartFile基本介紹
MultipartFile是springmvc官方提供的一個比較完善的檔案上傳元件,MultipartFile是一個組織介面它的實現類有
- org.springframework.web.multipart.commons.CommonsMultipartFile
- org.springframework.mock.web.MockMultipartFile
它在springmvc中的org.springframework.web.multipart這個包內,與org.springframework.web.multipart.commons
2. 準備工作
在寫上傳介面之前必須先加入流的依賴
<!-- 上傳檔案依賴元件 --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2.2</version> </dependency>
如果在依賴jar上有不是隻要加入commons-fileupload
HTTP Status 500 - Handler processing failed; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream,那就趕緊加入那個依賴吧。
光加入依賴還是遠遠不夠的,在前臺頁面也需要改不然後臺接收不到資料。預設的form提交是application/x-www-form-urlencoded而上傳檔案是把檔案用2進位制的方式傳輸預設的格式已經滿足不了需求,就需要使用multipart/form-data格式來發送接收。
1) 在form中加入 enctype="multipart/form-data"
<form action="admin/upload_theme.do" method="post" enctype="multipart/form-data"> <input type="file" name="meFile" /><p> <input type="submit" value="提交" /><p> <input type="reset" value="清空" /><p> </form>
2)上傳多檔案的話,需在表單的input中加入multiple="multiple"。(可一次選擇多個檔案)
<form action="admin/upload_theme.do" method="post" enctype="multipart/form-data"> <input type="file" name="meFile" multiple="multiple" /><p> <input type="submit" value="提交" /><p> <input type="reset" value="清空" /><p> </form>
3)上傳資料夾的話,需在表單input中加入webkitdirectory directory。(僅可以選擇資料夾,資料夾內的檔案也能成功上傳)
<form action="admin/upload_theme.do" method="post" enctype="multipart/form-data"> <input type="file" name="meFile" multiple="multiple" webkitdirectory directory /><p> <input type="submit" value="提交" /><p> <input type="reset" value="清空" /><p> </form>
頁面寫好了,還有一個重要的步奏:
設定虛擬資料夾,這是用來存放上傳上來的檔案。
1)雙擊進入伺服器的設定頁面
2)點選add新增虛擬本地的虛擬目錄
好了準備工作做好了,可以開始寫後臺業務邏輯。
3.後臺程式碼
1)單檔案上傳,注意MultipartFile的例項名要與頁面中表單的name值一致。
@RequestMapping("/upload_theme.do")//上傳主題 public String UploadTheme(MultipartFile meFile,Model model){ if (meFile != null) { System.out.println(meFile.getContentType());//在控制檯列印檔案的型別 System.out.println(meFile.getName());//返回檔案的名稱 System.out.println(meFile.getOriginalFilename());//返回檔案的原檔名 try { meFile.transferTo(new File("G:/temp/"+UUID.randomUUID()+meFile.getOriginalFilename())); } catch (IllegalStateException e) { e.printStackTrace(); model.addAttribute("msg", "上傳失敗"); return "/error.jsp"; } catch (IOException e) { e.printStackTrace(); model.addAttribute("msg", "上傳失敗"); return "/error.jsp"; } } model.addAttribute("msg", "上傳成功"); return "index"; }
2)多檔案上傳,注意頁面表單寫上面說到的屬性。不然不能選擇多個,和選擇資料夾。(頁面加入webkitdirectory directory multiple="multiple")
@RequestMapping("/upload_theme.do")//上傳主題 public String UploadTheme(HttpServletRequest request,Model model){ CommonsMultipartResolver cResolver = new CommonsMultipartResolver(); if (cResolver.isMultipart(request)) {//判斷是不是Multipart格式的資料 MultipartHttpServletRequest httpservletrequest = (MultipartHttpServletRequest) request;//將檔案格式的請求裝入MultipartHttpServletRequest物件中。 List<MultipartFile> list = httpservletrequest.getFiles("meFile");//通過呼叫該方法取出檔案到list for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i).getOriginalFilename()); System.out.println(list.get(i).getContentType()); try { list.get(i).transferTo(new File("G:/temp/"+UUID.randomUUID()+list.get(i).getOriginalFilename())); } catch (IllegalStateException e) { e.printStackTrace(); model.addAttribute("msg", "上傳失敗"); return "/error.jsp"; } catch (IOException e) { e.printStackTrace(); model.addAttribute("msg", "上傳失敗"); return "/error.jsp"; } } } model.addAttribute("msg", "上傳成功");
return "index"; }
點選提交資料夾
檔案的原檔名和檔案格式都打印出來了
4.最後
這上傳技術分享就到這裡了,看到的小夥伴有問題要不吝言辭哦。寫出來不容易,點個贊吧!
Spring Api : https://docs.spring.io/spring/docs/current/javadoc-api/