單個文件上傳
spring mvc 實現文件上傳需要引入兩個必須的jar包
1.所需jar包:
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
2.定義上傳頁面:
定義具有上傳功能的xx.jsp,其表單的設置需要注意,method屬性為post,enctype屬性為multipart/form-data
<!-- 文件上傳 -->
<form action="<%=basePath%>user/upload" method="post" enctype="multipart/form-data">
<input type="file" name="photo"/>
<input type="submit" value="上傳"/>
</form>
3.定義處理器:
對於處理器的定義需要注意以下幾點:
1.用於接收表單元素所提交參數的處理器方法的形參類型不是file,而是MultipartFile。
MultipartFile為一個接口,專門用於處理文件上傳問題。該接口中具有很多有用的方法。
例如:
1.1.獲取參數名稱 getName()
1.2.獲取文件的原始名稱 getOrinalFilename()
1.3.獲取文件大小 getSize()
1.4.判斷文件是否為空 isEmpty()
1.5.文件上傳 transferTo()
2.未選擇上傳文件
若用戶沒有選擇文件就直接提交了表單,此時處理器方法中的MultipartFile形參接收到的值並非null,
而是一個emptry的文件,對於未選擇文件這種情況,其判斷條件是file.isEmpty(),並非file==null
3.上傳文件類型
spring mvc的文件上傳功能並沒有直接的用於限制文件上傳類型的屬性或方法,需要對獲取到的文件的后綴名加以判斷,
最好的方式就是使用endsWith(".jpg")
4.上傳方法
對於單個文件上傳,直接使用MultipartFile的transferTo(file)方法,就可以完成上傳功能。
但是,該方法需要服務端用於存放文件的目錄必須存在,否則會出問題
代碼:
@RequestMapping("/upload")
public ModelAndView doUpload(MultipartFile photo,HttpSession session) throws IllegalStateException, IOException{
//判斷這個文件不為空
if(!photo.isEmpty()){
//服務端的imges目錄需要手動創建好
String path = session.getServletContext().getRealPath("/Images");
//獲取原始文件名
String fileName = photo.getOriginalFilename();
//限制上傳類型
if(fileName.endsWith(".jpg")||fileName.endsWith(".png")){
File file = new File(path, fileName);
//完成文件上傳
photo.transferTo(file);
}else{
return new ModelAndView("/user/fail");
}
}
return new ModelAndView("/user/success");
}
3.在spring mvc中注冊文件上傳處理器
在配置文件中注冊的時候需要注意:
1.bean的名稱固定:id必須為multipartResolver
2.文件上傳的字符集:默認為ISO-8859-1,可以通過defaultEncoding屬性設置字符集
3.限制文件大小:maxUploadSize屬性可以用來限制文件大小,單位B,-1則表示無限制
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize">
<value>100000</value>
</property>
<!--設置字符集--!>
<property name="defaultEncoding">
<value>UTF-8</value>
</property>
</bean>
多個文件上傳
前面的步驟都是一樣的,唯一的區別就是處理器,下面我就給大家詳解多個文件與單個文件上傳的區別,以及需要注意的地方。
@RequestMapping("/fileUpload")
public ModelAndView fileUpload(@RequestParam MultipartFile[] photos,HttpSession session) throws IllegalStateException, IOException{
//服務端的imges目錄需要手動創建好
String path = session.getServletContext().getRealPath("/Images");
for (int i = 0; i < photos.length; i++) {
if(!photos[i].isEmpty()){
String fileName = photos[i].getOriginalFilename();
if(fileName.endsWith(".jpg")||fileName.endsWith(".png")){
File file = new File(path, fileName);
//完成文件上傳
photos[i].transferTo(file);
}else{
//失敗返回
return new ModelAndView("/user/fail");
}
}
}
return new ModelAndView("/user/success");
}
需要注意的地方:
1.處理器的形參
用於接收表單元素所提交參數的處理器方法的形參類型為MultipartFile[]數組,並且必須使用注解@RequestParam修飾
為什么單個文件上傳時不需要@RequestParam注解修飾,而上傳多個文件時就需要用@RequestParam修飾呢?
因為在上傳多個文件時,每個表單中的文件對象均會被spring mvc框架將其轉換為MultipartFile類型,這個與單個文件上傳一樣,不需要@RequestParam修飾。
但是上傳多個文件時,處理器方法需要的不是MultipartFile類型,而是MultipartFile[]數組類型,默認情況下,框架會將表單中的表單元素一個個轉換為文件對象,
但並不會將多個文件對象創建為一個數組對象。此時就需要用@RequestParam注解修飾這個數組參數,需要框架調用相應的轉換器將請求參數轉換為方法參數類型。
所以上傳多個文件,處理器方法的MultipartFile[]數組必須使用@RequestParam注解修飾。
2.未選擇上傳文件
即使沒有選擇任何文件,MultipartFile[]數組也不為null。不僅不為null,其length值也大於0.
因為系統會為每個file表單元素創建一個file對象。只不過沒有選擇上傳文件的這個file將不會被賦予真正的文件,只是一個為empty的File。所以對於沒有選擇任何要上傳的文件
的情況的處理,只能逐個對文件表單元素進行判斷,判斷文件是否為empty。