在application.yml配置文件中配置上传路径和文件限制大小
spring: servlet: multipart: max-file-size: 10KB upload: file: location: D:\upload\
官方提供的可配置项:
# MULTIPART (MultipartProperties) spring.servlet.multipart.enabled=true # Whether to enable support of multipart uploads. spring.servlet.multipart.file-size-threshold=0 # Threshold after which files are written to disk. Values can use the suffixes "MB" or "KB" to indicate megabytes or kilobytes, respectively. spring.servlet.multipart.location= # Intermediate location of uploaded files. spring.servlet.multipart.max-file-size=1MB # Max file size. Values can use the suffixes "MB" or "KB" to indicate megabytes or kilobytes, respectively. spring.servlet.multipart.max-request-size=10MB # Max request size. Values can use the suffixes "MB" or "KB" to indicate megabytes or kilobytes, respectively. spring.servlet.multipart.resolve-lazily=false # Whether to resolve the multipart request lazily at the time of file or parameter access.官网路径:https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-multipart-file-upload-configuration 创建上传请求的Controller
首先在Controller中使用@Value注解获取到上传文件的保存路径
@Value("${upload.file.location}") private String uploadLocation;
然后写请求方法
@PostMapping(value = "/upload") public ResponseEntity<?> upload(HttpServletRequest reqquest, @RequestParam("file") MultipartFile file) { try { if (file.isEmpty()) { return new ResponseEntity<String>("文件为空", HttpStatus.ACCEPTED); } //String uploadDir = ResourceUtils.getURL("classpath:").getPath(); //String uploadDir = reqquest.getSession().getServletContext().getRealPath("/")+"upload\\"; String uploadDir = uploadLocation; File dir = new File(uploadDir); if(!dir.exists()) { dir.mkdirs(); } String filename = file.getOriginalFilename(); File serverFile = new File(uploadDir + filename); file.transferTo(serverFile); return new ResponseEntity<String>("上传成功", HttpStatus.OK); } catch (IllegalStateException e) { e.printStackTrace(); return new ResponseEntity<String>("上传失败", HttpStatus.ACCEPTED); } catch (IOException e) { e.printStackTrace(); return new ResponseEntity<String>("上传失败", HttpStatus.ACCEPTED); } }此处要注意一点就是@RequestParam("file")中的file必须与HTML上传input的name属性一致,如
<form action="upload" method="post" enctype="multipart/form-data"> <p>选择文件: <input type="file" name="file"/></p> <p><input type="submit" value="提交"/></p> </form>如果需要自定义保存的文件名,加入如下代码即可:
String suffix = filename.substring(filename.lastIndexOf(".")); String defineName = UUID.randomUUID() + suffix;
上传多个文件
@PostMapping(value = "/uploads") public ResponseEntity<?> uploads(HttpServletRequest reqquest, @RequestParam("file") MultipartFile[] files) { //String uploadDir = ResourceUtils.getURL("classpath:").getPath(); //String uploadDir = reqquest.getSession().getServletContext().getRealPath("/")+"upload\\"; String uploadDir = uploadLocation; File dir = new File(uploadDir); if(!dir.exists()) { dir.mkdirs(); } for(int i=0;i<files.length;i++) { if(files[i] != null) { MultipartFile file = files[i]; String filename = file.getOriginalFilename(); String suffix = filename.substring(filename.lastIndexOf(".")); String defineName = UUID.randomUUID() + suffix; File serverFile = new File(uploadDir + defineName); try { file.transferTo(serverFile); } catch (IllegalStateException e) { e.printStackTrace(); return new ResponseEntity<String>("上传第"+i+"个文件失败", HttpStatus.ACCEPTED); } catch (IOException e) { e.printStackTrace(); return new ResponseEntity<String>("上传第"+i+"个文件失败", HttpStatus.ACCEPTED); } } } return new ResponseEntity<String>("上传成功", HttpStatus.OK); }