文件上传下载、Excel 导入导出业务实战
文件上传下载、Excel 导入导出业务实战用户要上传头像、老板要导出报表、运营要批量导入会员——文件操作三件套是每个后端绕不开的基本功。一、文件上传基础1.1 MultipartFile 接口SpringBoot 用MultipartFile接口封装上传文件一个 HTTPmultipart/form-data请求到达后框架自动把文件部分封装为MultipartFile对象。RestControllerRequestMapping(/file)publicclassFileController{PostMapping(/upload)publicResultupload(RequestParam(file)MultipartFilefile){// 获取原始文件名StringoriginalFilenamefile.getOriginalFilename();// 获取文件大小字节longsizefile.getSize();// 获取文件类型StringcontentTypefile.getContentType();// 获取输入流InputStreaminputStreamfile.getInputStream();returnResult.ok(originalFilename 上传成功);}}1.2 上传大小限制配置SpringBoot 默认最大上传文件为 1MB超出直接报错。在application.yml中调整spring:servlet:multipart:max-file-size:50MB# 单个文件最大大小max-request-size:100MB# 整个请求最大大小多文件时二、单文件/多文件上传单文件上传用RequestParam接收多文件上传用数组或 ListPostMapping(/upload/multi)publicResultuploadMulti(RequestParam(files)MultipartFile[]files){for(MultipartFilefile:files){if(!file.isEmpty()){StringfileNameUUID.randomUUID()_file.getOriginalFilename();FiledestnewFile(D:/uploads/fileName);file.transferTo(dest);// 保存到本地磁盘}}returnResult.ok(上传成功);}文件名用 UUID 前缀防止重名覆盖transferTo()一行完成磁盘写入。三、文件下载下载本质就是读取文件流设置 HTTP 响应头后写回浏览器GetMapping(/download/{fileName})publicResponseEntityResourcedownload(PathVariableStringfileName){FilefilenewFile(D:/uploads/fileName);if(!file.exists())returnResponseEntity.notFound().build();ResourceresourcenewFileSystemResource(file);returnResponseEntity.ok().contentType(MediaType.APPLICATION_OCTET_STREAM).header(HttpHeaders.CONTENT_DISPOSITION,attachment; filename\URLEncoder.encode(fileName,UTF-8)\).body(resource);}Content-Disposition设为attachment告诉浏览器弹下载框否则浏览器会直接预览。中文文件名须URLEncoder.encode防乱码。四、Excel 导入导出EasyExcel 方案4.1 Apache POI vs EasyExcel对比维度Apache POIEasyExcel (阿里出品)内存占用全量加载到内存大文件直接 OOM逐行读取内存占用极小速度慢快号称 100M 文件 6 秒读完易用性代码量大注解式代码简洁推荐程度历史遗留维护新项目首选EasyExcel 的原理是边读边处理、用完就扔而不是 POI 那样把所有单元格数据撑爆内存。4.2 添加依赖dependencygroupIdcom.alibaba/groupIdartifactIdeasyexcel/artifactIdversion3.3.3/version/dependency4.3 导出 Excel注解模式定义实体类用ExcelProperty标注列DatapublicclassUserExcelVO{ExcelProperty(用户ID)privateLongid;ExcelProperty(用户名)privateStringusername;ExcelProperty(年龄)privateIntegerage;ExcelProperty(邮箱)privateStringemail;}导出只需一行GetMapping(/export)publicvoidexport(HttpServletResponseresponse)throwsIOException{ListUserExcelVOlistuserService.listForExport();response.setContentType(application/vnd.ms-excel);response.setCharacterEncoding(utf-8);response.setHeader(Content-Disposition,attachment; filenameURLEncoder.encode(用户列表.xlsx,UTF-8));EasyExcel.write(response.getOutputStream(),UserExcelVO.class).sheet(用户列表).doWrite(list);}4.4 导入 Excel监听器模式关键是不能让 EasyExcel 把全部数据加载完再处理要边读边入库publicclassUserExcelListenerextendsAnalysisEventListenerUserExcelVO{privateUserServiceuserService;publicUserExcelListener(UserServiceuserService){this.userServiceuserService;}Overridepublicvoidinvoke(UserExcelVOdata,AnalysisContextcontext){// 每读取一行就处理一行不是读完再处理userService.saveFromExcel(data);}OverridepublicvoiddoAfterAllAnalysed(AnalysisContextcontext){log.info(Excel 导入完成);}}Controller 层调用PostMapping(/import)publicResultimportExcel(RequestParam(file)MultipartFilefile)throwsIOException{EasyExcel.read(file.getInputStream(),UserExcelVO.class,newUserExcelListener(userService)).sheet().doRead();returnResult.ok(导入成功);}五、文件上传安全三道防线5.1 文件类型校验别信contentType客户端能伪造也别只信后缀名。用文件魔数Magic Number文件头几个字节验证privatestaticbooleanisImage(MultipartFilefile){try(InputStreamisfile.getInputStream()){byte[]headernewbyte[4];is.read(header);// JPEG: FF D8 FF, PNG: 89 50 4E 47, GIF: 47 49 46 38StringhexbytesToHex(header);returnhex.startsWith(FFD8FF)||hex.startsWith(89504E47);}catch(IOExceptione){returnfalse;}}5.2 路径穿越防护攻击者上传../../etc/passwd这类文件名如果直接拼接路径文件可能写入到系统敏感目录。解决方式取文件名时去掉路径信息只用纯文件名StringfileNameFilenameUtils.getName(file.getOriginalFilename());5.3 文件大小限制在application.yml设了max-file-size还不够要在 Controller 层也做校验防止绕过代理if(file.getSize()50*1024*1024){returnResult.fail(文件大小超过限制);}六、常见问题与解决问题原因解决大文件 OOMPOI 全量加载换 EasyExcel 监听器模式中文文件名乱码浏览器编码不一致URLEncoder.encode(filename, UTF-8)临时文件堆积文件未清理定时任务清理过期文件多文件上传 413 错误max-request-size太小调大该配置文件操作看似简单坑都在细节里。安全校验、编码处理、内存控制三者缺一不可。

相关新闻

【计算机毕业设计单片机案例】基于 STM32 的按键交互温湿度调控设备设计,基于单片机的温湿度上下限阈值控制系统研究(010501)

【计算机毕业设计单片机案例】基于 STM32 的按键交互温湿度调控设备设计,基于单片机的温湿度上下限阈值控制系统研究(010501)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/29 21:47:14 阅读更多 →
5分钟搞定《最终幻想16》终极优化:FFXVIFix完全指南

5分钟搞定《最终幻想16》终极优化:FFXVIFix完全指南

5分钟搞定《最终幻想16》终极优化:FFXVIFix完全指南 【免费下载链接】FFXVIFix Migrated to https://codeberg.org/Lyall/FFXVIFix 项目地址: https://gitcode.com/gh_mirrors/ff/FFXVIFix 用户故事:从黑边困扰到完美体验 作为一名《最终幻想16》…

2026/7/29 21:47:14 阅读更多 →
13年前的漏洞仍在威胁数万个数据中心管理系统

13年前的漏洞仍在威胁数万个数据中心管理系统

企业服务器操作系统底层的"无人地带",正成为恶意攻击者的下一个目标。 据数据中心安全公司Lava的研究人员披露,攻击者正通过利用基板管理控制器(BMC)的安全漏洞,渗透进入更广泛的数据中心环境。这些BMC设备普…

2026/7/29 21:46:13 阅读更多 →

最新新闻

AI时代 最值得培养的能力是什么? -- 《吾辈如神》作者给出的10点建议

AI时代 最值得培养的能力是什么? -- 《吾辈如神》作者给出的10点建议

过去,人们担心 AI 做得不够好。 今天,一个几乎相反的问题正在出现: 如果 AI 什么都能做得很好,甚至在越来越多的领域接近完美,那么,“做得好”本身还值多少钱? 写一篇结构完整的文章&#xf…

2026/7/29 21:55:17 阅读更多 →
个体户注册完成后,记账、报税、年报完整流程(新手避坑|程序员适用 2026)

个体户注册完成后,记账、报税、年报完整流程(新手避坑|程序员适用 2026)

程序员注册个体户承接外包私活,不等于注册完成就万事大吉。工商注册只是第一步,后续按时记账、按期报税、每年完成年报缺一不可。长期放任不管会出现税务异常、工商异常,产生罚款并且影响个人征信。本文整理个体户全套维护流程,附…

2026/7/29 21:55:17 阅读更多 →
揭秘达尔文.skill的9维度评估体系:提升AI技能质量的关键指标

揭秘达尔文.skill的9维度评估体系:提升AI技能质量的关键指标

揭秘达尔文.skill的9维度评估体系:提升AI技能质量的关键指标 【免费下载链接】darwin-skill 达尔文.skill —— 一个让你的Skill无限进化的系统:评估→改进→测试→保留或回滚 | Autoresearch-inspired autonomous skill optimization for Claude Code. …

2026/7/29 21:55:17 阅读更多 →
微信支付AI Skill接入指南与实战解析

微信支付AI Skill接入指南与实战解析

1. 微信支付AI Skill产品概述微信支付最新推出的AI支付接入Skill产品,本质上是一套面向开发者的人工智能支付解决方案工具包。这套产品将传统支付能力与AI技术深度融合,解决了开发者在智能场景下接入支付功能时的三大核心痛点:复杂场景适配&a…

2026/7/29 21:55:17 阅读更多 →
AG Kit安全漏洞修复案例:及时响应安全问题实例

AG Kit安全漏洞修复案例:及时响应安全问题实例

AG Kit安全漏洞修复案例:及时响应安全问题实例 【免费下载链接】ag-kit 项目地址: https://gitcode.com/GitHub_Trending/an/ag-kit AG Kit作为一款模块化AI代理工具包(Modular AI Agent Toolkit),其安全响应机制是保障用…

2026/7/29 21:55:17 阅读更多 →
Kitty终端模拟器深度配置指南:从GPU加速到工作流集成

Kitty终端模拟器深度配置指南:从GPU加速到工作流集成

1. 项目概述:为什么是Kitty?如果你和我一样,每天有超过8小时的时间是在终端里度过的,那么一个趁手的终端模拟器,其重要性不亚于程序员手中的键盘。从早期的xterm、gnome-terminal,到后来功能丰富的Terminat…

2026/7/29 21:54:17 阅读更多 →

日新闻

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻