SpringMVC(六)檔案上傳
阿新 • • 發佈:2018-11-30
SpringMVC(六)檔案上傳
Spring MVC對上傳檔案的支援
首先,DispatcherServlet
會使用介面卡模式,將HttpServletRequest
介面物件轉換為MultipartHttpServertRequest
物件。MultipartHttpServetRequest
介面拓展了HttpServletRequest
介面的所有方法,而且定義了一些操作檔案的方法,這樣通過這些方法就可以實現對上傳檔案的操作。
可以看到,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,"上傳成功");
}