当前位置: 首页 > news >正文

MultipartFile实现文件上传

这里记录下使用SpringBoot的MultipartFile类实现文件上传功能。

Controller层

@Tag(name = "ResourceController", description = "前台门户-资源模块")
@RestController
@RequestMapping(ApiRouterConsts.API_FRONT_RESOURCE_URL_PREFIX)
@RequiredArgsConstructor
public class ResourceController {private final ResourceService resourceService;/*** 图片上传接口*/@Operation(summary = "图片上传接口")@PostMapping("/image")RestResp<String> uploadImage(@Parameter(description = "上传文件") @RequestParam("file") MultipartFile file) {return resourceService.uploadImage(file);}}

Service层

@Service
@RequiredArgsConstructor
@Slf4j
public class ResourceServiceImpl implements ResourceService {@SneakyThrows@Overridepublic RestResp<String> uploadImage(MultipartFile file) {LocalDateTime now = LocalDateTime.now();String savePath =SystemConfigConsts.IMAGE_UPLOAD_DIRECTORY+ now.format(DateTimeFormatter.ofPattern("yyyy")) + File.separator+ now.format(DateTimeFormatter.ofPattern("MM")) + File.separator+ now.format(DateTimeFormatter.ofPattern("dd"));String oriName = file.getOriginalFilename();assert oriName != null;String saveFileName = IdWorker.get32UUID() + oriName.substring(oriName.lastIndexOf("."));File saveFile = new File(fileUploadPath + savePath, saveFileName);if (!saveFile.getParentFile().exists()) {boolean isSuccess = saveFile.getParentFile().mkdirs();if (!isSuccess) {throw new BusinessException(ErrorCodeEnum.USER_UPLOAD_FILE_ERROR);}}file.transferTo(saveFile);if (Objects.isNull(ImageIO.read(saveFile))) {// 上传的文件不是图片Files.delete(saveFile.toPath());throw new BusinessException(ErrorCodeEnum.USER_UPLOAD_FILE_TYPE_NOT_MATCH);}return RestResp.ok(savePath + File.separator + saveFileName);}
}

@RequiredArgsConstructor

这里顺便提一嘴 @RequiredArgsConstructor注解的使用。

@RequiredArgsConstructor 是 Lombok 提供的注解,它会在编译时自动为类生成一个包含所有 final 修饰的字段和未初始化的 @NonNull 注解修饰字段的构造函数。

在这里插入图片描述

@SneakyThrows

@SneakyThrows 是 Lombok 库提供的一个注解,其主要作用是简化异常处理代码,允许方法抛出受检异常(Checked Exception)却无需在方法签名中显式声明。下面详细介绍该注解。

在 Java 里,异常分为受检异常和非受检异常。
受检异常:编译器会强制要求处理的异常,如 IOException、SQLException 等。方法若可能抛出受检异常,就必须在方法签名中使用 throws 关键字声明,或者在方法内部使用 try-catch 块捕获处理。
非受检异常:继承自 RuntimeException 的异常,编译器不会强制要求处理,如 NullPointerException、ArrayIndexOutOfBoundsException 等。

在这里插入图片描述

http://www.xdnf.cn/news/632575.html

相关文章:

  • python 程序实现了毫米波大规模MIMO系统中的信道估计对比实验
  • 基于CEEMDAN-Transformer-BiLSTM的多特征风速气候预测的完整实现方案及PyTorch源码解析
  • 2025年渗透测试面试题总结-匿名[实习]安全工程师(大厂) (2)(题目+回答)
  • 大数据与数据分析【数据分析全栈攻略:爬虫+处理+可视化+报告】
  • Github上一些使用技巧(缩写、Issue的Highlight)自用
  • Ollama-OCR:基于Ollama多模态大模型的端到端文档解析和处理
  • 对象存储(Minio)使用
  • 一周学会Pandas2 Python数据处理与分析-Pandas2数据合并与对比-pd.merge():数据库风格合并
  • 基于蒙特卡罗 AWGN信道调制信号互信息(信道容量)
  • vc++在Windows中查找扬声器输出的当前音量级别
  • DeepSeek+白果AI论文:开启答辩PPT生成的「智能双引擎」时代
  • 国际前沿知识系列二:基于不同类型头部碰撞中的运动学特征预测能力统计分析
  • 005 深度优先搜索(DFS)算法详解:图解+代码+经典例题
  • C++编译/链接模型
  • Fuzz 模糊测试篇JS 算法口令隐藏参数盲 Payload未知文件目录
  • 基于 ColBERT 框架的后交互 (late interaction) 模型速递:Reason-ModernColBERT
  • 广东省省考备考(第十九天5.24)—言语(第七节课)
  • Qwen2.5 VL 多模态融合阶段(3)
  • python炸鱼船
  • java基础(继承)
  • 【免费使用】剪Y专业版 8.1/CapCut 视频编辑处理,素材和滤镜
  • Spyglass:跨时钟域同步(长延迟信号)
  • 异步处理与事件驱动中的模型调用链设计
  • 5.24 打卡
  • 【电池】极端环境对锂离子电池的影响-【2.5万字解析】
  • 数值分析(电子和通信类)
  • 什么是电离层闪烁
  • WPS 64位与EndNote21.5工作流
  • 【大模型】TableLLM论文总结
  • 力扣刷题(第三十六天)