SpringMVC系列之文件上傳【springmvc整合commons-fileupload實現文件上傳功能】

一、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";
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章