構建工程
為例創建一個springmvc工程你需要spring-boot-starter-thymeleaf和 spring-boot-starter-web的起步依賴。為例能夠上傳文件在服務器,你需要在web.xml中加入標簽做相關的配置,但在sringboot 工程中,它已經為你自動做了,所以不需要你做任何的配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <dependencies> ?????? <dependency> ?????????? <groupId>org.springframework.boot</groupId> ?????????? <artifactId>spring-boot-starter-web</artifactId> ?????? </dependency> ?????? <dependency> ?????????? <groupId>org.springframework.boot</groupId> ?????????? <artifactId>spring-boot-starter-test</artifactId> ?????????? <scope>test</scope> ?????? </dependency> ?????? <dependency> ?????????? <groupId>org.springframework.boot</groupId> ?????????? <artifactId>spring-boot-starter-thymeleaf</artifactId> ?????? </dependency> ?? </dependencies> |
創建文件上傳controller
直接貼代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | @Controller public ?class ?FileUploadController { ???? private ?final ?StorageService storageService; ???? @Autowired ???? public ?FileUploadController(StorageService storageService) { ???????? this .storageService = storageService; ???? } ???? @GetMapping ( "/" ) ???? public ?String listUploadedFiles(Model model)? throws ?IOException { ???????? model.addAttribute( "files" , storageService ???????????????? .loadAll() ???????????????? .map(path -> ???????????????????????? MvcUriComponentsBuilder ???????????????????????????????? .fromMethodName(FileUploadController. class ,? "serveFile" , path.getFileName().toString()) ???????????????????????????????? .build().toString()) ???????????????? .collect(Collectors.toList())); ???????? return ?"uploadForm" ; ???? } ???? @GetMapping ( "/files/{filename:.+}" ) ???? @ResponseBody ???? public ?ResponseEntity<Resource> serveFile( @PathVariable ?String filename) { ???????? Resource file = storageService.loadAsResource(filename); ???????? return ?ResponseEntity ???????????????? .ok() ???????????????? .header(HttpHeaders.CONTENT_DISPOSITION,? "attachment; filename=\"" +file.getFilename()+ "\"" ) ???????????????? .body(file); ???? } ???? @PostMapping ( "/" ) ???? public ?String handleFileUpload( @RequestParam ( "file" ) MultipartFile file, ??????????????????????????????????? RedirectAttributes redirectAttributes) { ???????? storageService.store(file); ???????? redirectAttributes.addFlashAttribute( "message" , ???????????????? "You successfully uploaded " ?+ file.getOriginalFilename() +? "!" ); ???????? return ?"redirect:/" ; ???? } ???? @ExceptionHandler (StorageFileNotFoundException. class ) ???? public ?ResponseEntity handleStorageFileNotFound(StorageFileNotFoundException exc) { ???????? return ?ResponseEntity.notFound().build(); ???? } } |
這個類通過@Controller注解,表明自己上一個Spring mvc的c。每個方法通過?
@GetMapping 或者@PostMapping注解表明自己的 http方法。
- GET / 獲取已經上傳的文件列表
- GET /files/{filename} 下載已經存在于服務器的文件
- POST / 上傳文件給服務器
創建一個簡單的 html模板
為了展示上傳文件的過程,我們做一個界面:?
在src/main/resources/templates/uploadForm.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <html xmlns:th= "http://www.thymeleaf.org" > <body> ???? <div th: if = "${message}" > ???????? <h2 th:text= "${message}" /> ???? </div> ???? <div> ???????? <form method= "POST" ?enctype= "multipart/form-data" ?action= "/" > ???????????? <table> ???????????????? <tr><td>File to upload:</td><td><input type= "file" ?name= "file" ?/></td></tr> ???????????????? <tr><td></td><td><input type= "submit" ?value= "Upload" ?/></td></tr> ???????????? </table> ???????? </form> ???? </div> ???? <div> ???????? <ul> ???????????? <li th:each= "file : ${files}" > ???????????????? <a th:href= "${file}" ?th:text= "${file}" ?/> ???????????? </li> ???????? </ul> ???? </div> </body></html> |
上傳文件大小限制
如果需要限制上傳文件的大小也很簡單,只需要在springboot 工程的src/main/resources/application.properties 加入以下:
1 2 | spring.http.multipart.max-file-size=128KB spring.http.multipart.max-request-size=128KB |