一、Maven依賴
- commons-fileupload
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
二、需要配置的Bean對象
- multipartResolver
<!-- id的值必須是multipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 允許上傳的文件大小:2MB 【1024*1024*2】-->
<property name="maxUploadSize" value="2097152" />
</bean>
三、前端文件上傳時的參數要求
- contentType(encType):multipart/form-data
- http method:POST
請求消息體的編碼類型必須是 multipart/form-data
。 form表單默認的encType是application/x-www-form-urlencoded
,所以使用form表單上傳文件的時候,必須修改encType的值。如果沒有使用form表單上傳,那麼在發送請求時,需要將contentType的值修改爲 multipart/form-data
請求頭類型必須是 POST
類型。form表單請求類型默認是GET類型,文件上傳時需要修改成POST
。如果沒有使用form表單,那麼請求發送的時候,將type/method修改成POST
。
看一下,示例代碼:
<form th:action="@{/user/upload}" method="post" enctype="multipart/form-data">
用戶名: <input type="text" name="name" /> <br>
年齡: <input type="text" name="age" /> <br>
頭像: <input type="file" name="file" /> <br>
<input type="submit" value="添加用戶">
</form>
四、後端Controller使用MultipartFile對象接收
SpringMVC底層,自動爲我們完成傳輸文件的解析工作,並存放在MultipartFile對象中。如果是多個文件,那麼Springmvc會自動將文件存放在MultipartFile[ ]數組對象中。通過調用對象,來獲取其中的具體文件,直接來看代碼。
@RequestMapping("/upload")
public String addUser(MultipartFile file, User user) throws IOException {
// 上傳文件 - 圖片服務器(分佈式文件系統:FastDFS、GlusterFS【可在本地掛載路徑】、MongoDB文件系統)
// 存儲到本地目錄: d:/upload/
// 在數據庫中如何保存: 如果圖片非常小,可轉成 bytes64編碼/二進制編碼 存放到數據庫中
// 如果圖片大,則存放路徑。 /pics/文件名.後綴
// 前端訪問的時候:http://localhost:8080/springmvc-review-02/pics/文件名.後綴
// 獲取文件的原始名稱
String originalFilename = file.getOriginalFilename();
// 獲取後綴 沒有 .
String suffix = FilenameUtils.getExtension(originalFilename);
// 重命名
String prefix = UUID.randomUUID().toString().replaceAll("-", "");
// 新文件名稱
String newFilename = prefix + "." + suffix;
File destFile = new File("D:/upload/" + newFilename);
file.transferTo(destFile);
user.setPic("/pics/" + newFilename);
userService.savaUser(user);
return "redirect:/user/toAdd";
}