基於springboot 2.3.4.RELEASE。 pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency>
提交配置屬注意項:1、POST提交; 2、enctype="multipart/form-data"
第一種:使用spring的 MultipartFile 接口來接收
<form action="/file/upload1" method="post" enctype="multipart/form-data"> <input type="file" name="file"/> <input type="submit" value="上傳"/> </form>
@RequestMapping(value = " file/upload1") public String fileUpload1(@RequestParam("file") MultipartFile file) throws IOException { String path=uploadPath+ File.separator + "upload1" + File.separator +file.getOriginalFilename(); File destination = new File(path); if (!destination.getParentFile().exists()){ FileUtils.forceMkdirParent(destination); //使用commons-io的工具類 } file.transferTo(destination); return "success:" + path; }
默認文件大小在1MB, 可以使用配置文件application.yml進行調節:
spring: servlet: multipart: max-file-size: 10MB #每個文件大小 max-request-size: 30MB #請求上傳文件總量
第二種,使用具體實現類CommonsMultipartFile。 如果參數過多也可以封裝成對象進行傳遞
public class UploadParam { private int tradeDate; private CommonsMultipartFile file; //省略set get }
前端html的寫法與第一種無異。
@RequestMapping("upload2") public String fileUpload2(UploadParam param) throws IOException { String file = uploadPath + File.separator + "upload2" + File.separator + param.getFile().getOriginalFilename(); File destination = new File(file); if (!destination.getParentFile().exists()){ FileUtils.forceMkdirParent(destination); } param.getFile().transferTo(destination); return "success: " + file; }
第三種,多文件上傳。參數屬性名一樣即可。
public class MultiFileParam { private int tradeDate; private List<CommonsMultipartFile> file; //省略set get }
@RequestMapping("upload3") public String fileUpload3(MultiFileParam param) throws IOException { String file = uploadPath + File.separator + "upload3" ; File destination = new File(file); if (!destination.exists()){ FileUtils.forceMkdirParent(destination); } param.getFile().forEach(f->{ File dest = new File(file + File.separator + f.getOriginalFilename()); try { f.transferTo(dest); } catch (IOException e) { e.printStackTrace(); } }); return "success: " + file; }
<form action="/upload3" method="post" enctype="multipart/form-data"> <input type="file" name="file"/> <input type="file" name="file"/> <input type="submit" value="上傳"/> </form>
常見異常及處理:
1、fileupload.impl.FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.
超過默認大小。通過配置文件調節即可。
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency>
3、'org.springframework.web.multipart.commons.CommonsMultipartFile' for property 'file'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile' to required type 'org.springframework.web.multipart.commons.CommonsMultipartFile' for property 'file': no matching editors or conversion strategy found] 使用實現類,必需實例加載
@Bean public CommonsMultipartResolver multipartResolver(){ CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); multipartResolver.setDefaultEncoding("UTF-8"); multipartResolver.setMaxInMemorySize(10*1024*1024); multipartResolver.setMaxUploadSize(30*1024*1024); return multipartResolver; }