1. 程式人生 > >SpringMVC(六)檔案上傳

SpringMVC(六)檔案上傳

SpringMVC(六)檔案上傳

Spring MVC對上傳檔案的支援

首先,DispatcherServlet會使用介面卡模式,將HttpServletRequest介面物件轉換為MultipartHttpServertRequest物件。MultipartHttpServetRequest介面拓展了HttpServletRequest介面的所有方法,而且定義了一些操作檔案的方法,這樣通過這些方法就可以實現對上傳檔案的操作。

MultipartHttpServetRequest
可以看到,MultipartHttpServetRequest介面的作用是,通過類的適配加入原有HTTP請求物件的功能,並擴充套件檔案操作功能。

檔案上傳配置

# springMVC檔案上傳配置
# MULTIPART(multipartProperties)
# 是否啟用soring mvc多分部上傳功能
spring.servlet.multipart.enabled=true
# 將檔案寫入磁碟的閾值。只可以使用字尾"MB"或者"KB"來表示兆位元組或位元組大小
spring.servlet.multipart.file-size-threshold=0
# 指定預設上傳的資料夾
spring.servlet.multipart.location=
# 限制單個檔案最大大小
spring.servlet.multipart.max-file-size=1MB
# 先直所有檔案最大大小
spring.servlet.multipart.max-request-size=10MB
# 是否延遲多部分檔案請求的引數和檔案的解析
spring.servlet.multipart.resolve-lazily=false

根據這些配置,spring boot會自動生成StandardServletMultipartResolver物件,這樣就能能夠對上傳檔案進行配置。對於檔案的上傳可以使用sevlet api提供的Part介面或者spring mvc提供的MultipartFile介面作為引數。

檔案上傳

application.properties配置檔案

# 指定預設上傳的資料夾
spring.servlet.multipart.location=e:/springboot
# 限制單個檔案最大大小,這裡設定為5MB
spring.servlet.multipart.max-file-size=5242880
# 限制所有檔案最大大小,這裡設定為20MB
spring.servlet.multipart.max-request-size=20MB

這裡設定了上傳的目標資料夾為e:/pringboot目錄,並且指定單個檔案大小為5MB,所有檔案最大為20MB。

為了測試檔案的上傳,我們使用thymeleaf作為模板寫一個HTML檔案。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">

<head>
    <meta charset="UTF-8">
    <title>檔案上傳</title>
</head>
<body>
    <form method="post" action="./request", enctype="multipart/form-data">
        <input type="file" name="file" value="請選擇上傳檔案"/>
        <input type="submit" value="提交"/>
    </form>

</body>
</html>

這裡表單宣告為muiltipart/form-data,如果沒有這個宣告,Spring MVC就會解析檔案請求出錯,從而導致上傳檔案失敗。

開發控制器

package com.lay.mvc.controller;

/**
 * @Description:檔案上傳控制器
 * @Author: lay
 * @Date: Created in 19:55 2018/11/14
 * @Modified By:IntelliJ IDEA
 */
@Controller
public class FileController {
    //上傳頁面展示
    @GetMapping("/upload/page")
    public String uploadPage(){
        return "/file/upload";
    }
    /**
     *
     * @Description: 處理上傳檔案結果
     * @param: [success, msg]
     * @return: java.util.Map<java.lang.String,java.lang.Object>
     * @auther: lay
     * @date: 10:50 2018/11/15
     */
    private Map<String,Object> dealResultMap(boolean success,String msg){
        Map<String,Object> result=new HashMap<>();
        result.put("success",success);
        result.put("msg",msg);
        return result;
    }


}

HttpServletRequest

/**
     *
     * @Description: 使用HttpServletRequest作為引數
     * @param: [request]
     * @return: java.util.Map<java.lang.String,java.lang.Object>
     * @auther: lay
     * @date: 11:10 2018/11/15
     */
    @PostMapping("/upload/request")
    @ResponseBody
    public Map<String,Object> uploadRequest(HttpServletRequest request){
        boolean flag=false;
        MultipartHttpServletRequest mreq=null;
        //強制轉換為MultipartHttpServletRequest介面物件
        if(request instanceof MultipartHttpServletRequest){
            mreq=(MultipartHttpServletRequest)request;
        }else {
            return dealResultMap(false,"上傳失敗");
        }
        //獲取MultipartFile檔案
        MultipartFile mf=mreq.getFile("file");
        //獲取原始檔名稱
        String fileName=mf.getOriginalFilename();
        File file=new File(fileName);
        try {
            //儲存檔案
            mf.transferTo(file);
        }catch (Exception e){
            e.printStackTrace();
            return dealResultMap(false,"上傳失敗");
        }
        return dealResultMap(true,"上傳成功");
    }

MultiPartFile

 //使用Spring MVC 的MultipartFille類作為引數
    @PostMapping("/upload/multipart")
    @ResponseBody
    public Map<String,Object> uploadMultipartFile(MultipartFile file){
        String fileName=file.getOriginalFilename();
        File dest=new File(fileName);
        try {
            file.transferTo(dest);
        } catch (IOException e) {
            e.printStackTrace();
            return dealResultMap(false,"上傳失敗");
        }
        return dealResultMap(true,"上傳成功");
    }

Part

 /**
     *
     * @Description: 使用Part介面作為引數
     * @param: [success, msg]
     * @return: java.util.Map<java.lang.String,java.lang.Object>
     * @auther: lay
     * @date: 10:36 2018/11/15
     */
    @PostMapping("/upload/part")
    @ResponseBody
    public Map<String,Object> uploadPart(Part file){
        //獲取提交檔名稱
        String fileName=file.getSubmittedFileName();
        try {
            file.write(fileName);
        } catch (IOException e) {
            e.printStackTrace();
            return dealResultMap(false,"上傳失敗");
        }
        return dealResultMap(true,"上傳成功");
    }