<前文回顾>
<今日更新>
一、开篇整活儿
今儿个咱唠唠 Spring Boot 里头的文件上传与下载。这玩意儿吧,说大不大,说小不小,整好了是锦上添花,整不好就是火上浇油。你要是刚入门,那可得悠着点儿,别一上来就整得自己“翻车”了。
二、文件上传与下载是啥玩意儿?
文件上传与下载是 Web 开发里头的一个常见需求,说白了就是让用户能把文件传到服务器上,或者从服务器上下载文件。Spring Boot 里头默认就集成了文件上传与下载的支持,用起来贼方便。
1. 文件上传的核心概念
文件上传里头有几个核心概念:MultipartFile、MultipartResolver、File。
- MultipartFile:就是上传的文件对象,里头包含了文件的内容、文件名、文件类型啥的。
- MultipartResolver:就是解析上传文件的组件,Spring Boot 里头默认用的是 StandardServletMultipartResolver。
- File:就是 Java 里头的文件对象,用来表示文件。
2. 文件下载的核心概念
文件下载里头有几个核心概念:Resource、HttpServletResponse、FileSystemResource。
- Resource:就是 Spring 里头的资源对象,用来表示文件。
- HttpServletResponse:就是 HTTP 响应对象,用来设置响应头、响应体啥的。
- FileSystemResource:就是 Spring 里头的文件系统资源对象,用来表示文件。
三、Spring Boot 实现文件上传
Spring Boot 里头实现文件上传很简单,只要加个配置,配个控制器就行了。
1. 添加配置
首先,你得在 application.properties 里头加个文件上传的配置。
Properties Code |
spring.servlet.multipart.enabled=true spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=50MB |
这段代码里头,spring.servlet.multipart.enabled 是启用文件上传,spring.servlet.multipart.max-file-size 是单个文件的最大大小,spring.servlet.multipart.max-request-size 是请求的最大大小。
2. 实现文件上传
然后,你可以在控制器里头实现文件上传。
Java Code |
@RestController @RequestMapping("/files") public class FileController { @PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file) { if (file.isEmpty()) { return "文件不能为空"; } try { File dest = new File("uploads/" + file.getOriginalFilename()); file.transferTo(dest); return "文件上传成功"; } catch (IOException e) { e.printStackTrace(); return "文件上传失败"; } } } |
这段代码里头,uploadFile 方法用 @RequestParam("file") 注解接收上传的文件,然后用 transferTo 方法把文件保存到服务器上。
四、Spring Boot 实现文件下载
Spring Boot 里头实现文件下载很简单,只要加个控制器就行了。
1. 实现文件下载
首先,你可以在控制器里头实现文件下载。
Java Code |
@RestController @RequestMapping("/files") public class FileController { @GetMapping("/download/{filename}") public ResponseEntity<Resource> downloadFile(@PathVariable String filename) { try { File file = new File("uploads/" + filename); Resource resource = new FileSystemResource(file); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"") .body(resource); } catch (Exception e) { e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } } |
这段代码里头,downloadFile 方法用 @PathVariable 注解接收文件名,然后用 FileSystemResource 把文件作为资源返回。
五、Spring Boot 实现文件管理的坑点
1. 文件大小限制
Spring Boot 里头,文件大小限制没配好,那文件上传就不起作用了。你要是没配好,那可得好好检查检查。
2. 文件保存路径
Spring Boot 里头,文件保存路径没配好,那文件上传就不起作用了。你要是没配好,那可得好好检查检查。
3. 文件下载响应头
Spring Boot 里头,文件下载响应头没配好,那文件下载就不起作用了。你要是没配好,那可得好好检查检查。
专有名词解释
- MultipartFile:上传的文件对象,里头包含了文件的内容、文件名、文件类型啥的。
- MultipartResolver:解析上传文件的组件,Spring Boot 里头默认用的是 StandardServletMultipartResolver。
- File:Java 里头的文件对象,用来表示文件。
- Resource:Spring 里头的资源对象,用来表示文件。
- HttpServletResponse:HTTP 响应对象,用来设置响应头、响应体啥的。
- FileSystemResource:Spring 里头的文件系统资源对象,用来表示文件。
- HttpHeaders.CONTENT_DISPOSITION:HTTP 响应头,用来设置文件下载的响应头。
写在最后
身为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),已经在找朋友内测了,比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算有用,大家基本都能拿到想要的offer...
我深刻意识到,能自由做自己喜欢的事情是有多么不容易,又是多么有成就感。所以我拉了两三个志同道合的好友,开了一间公司,继续朝着“自由”的目标前进。
当下呢,我们希望有更多的朋友能够参与到产品的测试中来,体验并且给出更好的建议。未来可能会在博客po更多关于我们产品的内容,包括使用场景、说明、课程等,希望能对大家有所帮助。
另外,想整个花活儿,每天花个1-2小时,来帮助我素未谋面的老朋友们看看简历,提提意见啥的,纯属为爱发电。我在线时间不固定,但是不要米,咱就别要自行车儿了呗~如果您有兴趣,可以点击文章底部卡片一起交流(人工回复,比较慢,请担待)。
最后,请大家持续关注我们的博客,未来还有很多栏目,一起发掘~!
(来呀~↓↓↓~老铁)