"用户上传头像时服务器报了500,但日志里只有一堆堆栈,根本不知道哪里出了问题。"李眉皱着眉头把日志发给小崔,"没有全局异常处理的生产环境,就像没有消防员的仓库——起火了你只能看着它烧。"
——李眉,飞翔科技运维工程师
本章导读:文件上传与异常处理
本章定位
本章解决的核心问题:如何在Spring MVC中安全、高效地处理文件上传与下载,以及如何构建统一、友好的异常响应机制,避免丑陋的堆栈信息暴露给客户端。
学习路线图
学习建议:先掌握文件上传的核心API(MultipartFile),再学习文件下载的响应头控制,随后转入异常处理主线——从方法级@ExceptionHandler到全局@ControllerAdvice,最后理解@ResponseStatus如何定义异常与HTTP状态码的映射关系。
文件关系说明
| 文件 | 一句话角色 |
|---|---|
MultipartFile.md | 上传核心:Spring MVC封装上传文件的API,包括文件接收、元数据获取、存储到磁盘或云OSS的完整操作。 |
文件下载.md | 流式响应:通过设置Content-Disposition等响应头,将服务器文件以流的形式安全返回给客户端。 |
ExceptionHandler.md | 局部兜底:在单个控制器内用@ExceptionHandler捕获特定异常,返回自定义错误响应,适用于局部异常场景。 |
ControllerAdvice.md | 全局视图异常:@ControllerAdvice结合@ExceptionHandler实现跨所有控制器的统一异常处理,传统服务端渲染项目的标准方案。 |
RestControllerAdvice.md | 全局REST异常:@RestControllerAdvice的组合注解本质,以及它在RESTful API项目中返回统一JSON错误体的最佳实践。 |
ResponseStatus.md | 状态映射:@ResponseStatus如何将自定义异常与HTTP状态码绑定,以及它与全局异常处理的协作关系。 |
知识图谱
图谱解读:文件上传依赖MultipartResolver解析请求,MultipartFile提供文件操作API;文件下载则通过ResponseEntity封装输入流和响应头实现。异常处理呈三层结构:方法级@ExceptionHandler是局部兜底,@ControllerAdvice和@RestControllerAdvice分别面向视图渲染和RESTful API提供全局统一处理,@ResponseStatus则负责将异常语义映射为标准的HTTP状态码。
与下一章的衔接
本章学完后,你已经掌握了"文件流处理"和"异常统一治理"。下一章将解决"如何提升开发效率与代码质量"——你将学习MockMvc进行控制器单元测试、RedirectAttributes实现重定向传参、国际化(i18n)支持多语言,以及Spring MVC开发的最佳实践,这是从"功能实现"到"工程化交付"的升华。