一文让你测底明白如何在 Spring Boot 上传中将 MultipartFile 转 File 对象

一文让你测底明白如何在 Spring Boot 上传中将 MultipartFile 转 File 对象
在这里插入图片描述
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》专栏19年编写主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
🌛《开源项目》本专栏主要介绍目前热门的开源项目,带大家快速了解并轻松上手使用
🍎 《前端技术》专栏以实战为主介绍日常开发中前端应用的一些功能以及技巧,均附有完整的代码示例
✨《开发技巧》本专栏包含了各种系统的设计原理以及注意事项,并分享一些日常开发的功能小技巧
💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整
👍《Spring Security》专栏中我们将逐步深入Spring Security的各个技术细节,带你从入门到精通,全面掌握这一安全技术
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

一文让你测底明白如何在 Spring Boot 上传中将 MultipartFile 转 File 对象

1. 前言

在我们开发 Spring Boot Web 应用中,文件上传通常通过 MultipartFile 接口接收。但有时我们需要将 MultipartFile 转成标准的 java.io.File 对象,便于与依赖本地文件 API 的第三方库(如 Apache POI、Tika、图像处理库等)集成,也便于做临时文件存储与后续处理

在这里插入图片描述

你可能会有以下需求:

第三方库依赖:如某些 PDF 解析、办公室文档处理 API 只接受 File 对象或文件路径文件处理:对上传文件进行临时处理、压缩、分析;临时缓存:需要将上传文件缓存在本地以做异步处理、批量扫描等

那么我们就需要将 MultipartFile 转换 java.io.File 对象,本文博主将讲解常见的四种方案,希望小伙伴们阅后能快速掌握。


2. 常见4种转换方案

2.1 使用 transferTo() 方法

transferTo(File) — Spring推荐 最简洁高效
此方式直接调用 MultipartFile.transferTo(dest),将上传内容写入指定文件。

publicFileconvertByTransferTo(MultipartFile multipartFile,String destPath)throwsIOException{File destFile =newFile(destPath);// 如果目标目录不存在,则创建File parent = destFile.getParentFile();if(parent !=null&&!parent.exists()){ parent.mkdirs();} multipartFile.transferTo(destFile);return destFile;}

优点:代码简洁,直接写入;
缺点:必须确保 MultipartFile 未被多次使用,且目标路径可写


2.2 使用FileUtils.copyInputStreamToFile

需要引入 Apache Commons IO 依赖

<!-- 在 pom.xml 中添加依赖 --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency>

调用 commons-io 中提供的 FileUtils 工具类

publicstaticFileconvertWithCommonsIO(MultipartFile multipartFile,String destPath)throwsIOException{File dest =newFile(destPath);FileUtils.forceMkdirParent(dest);FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), dest);return dest;}

优点:极简;FileUtils 自动管理目录创建与流关闭
缺点:需额外 commons-io 依赖


2.3 使用 Java NIO Files.copy

java.nio.file.Files 提供了便捷的方法,将 InputStream 复制到路径(Path)上

publicstaticFileconvertWithNio(MultipartFile multipartFile,String destPath)throwsIOException{File destFile =newFile(destPath);// 如果目标目录不存在,则创建File parent = destFile.getParentFile();if(parent !=null&&!parent.exists()){ parent.mkdirs();}try(var in = multipartFile.getInputStream()){returnFiles.copy(in, destFile,StandardCopyOption.REPLACE_EXISTING);}}

优点:代码简洁;使用现代 NIO API,可选覆盖或保留原有文件
缺点:需管理目录和文件删除


2.4 手动处理输入输出流

手动通过 InputStream/OutputStream 读取 MultipartFile 的内容,并写入 Java File。适用于任何实现

publicstaticFileconvertWithStream(MultipartFile multipartFile)throwsIOException{// 创建临时文件,JVM 退出时会尝试删除String prefix ="upload_";String suffix ="_"+ multipartFile.getOriginalFilename();File tempFile =File.createTempFile(prefix, suffix);try(InputStream in = multipartFile.getInputStream();OutputStream out =newFileOutputStream(tempFile)){byte[] buffer =newbyte[8192];int len;while((len = in.read(buffer))!=-1){ out.write(buffer,0, len);}}return tempFile;}

优点:最通用、可精细控制;无论底层如何实现都可工作
缺点:需要自行管理临时文件删除

3. 全局封装及测试

基于上述的4种方案,我们可以整理成一个工具类,方便后续的使用以及测试

importorg.apache.commons.io.FileUtils;importorg.springframework.web.multipart.MultipartFile;importjava.io.File;importjava.io.IOException;importjava.io.InputStream;importjava.nio.file.Files;importjava.nio.file.Path;importjava.nio.file.StandardCopyOption;publicclassFileConverter{// 方法1: 使用transferTo()方法 (Spring推荐)publicstaticFileconvertUsingTransferTo(MultipartFile file)throwsIOException{File convertedFile =createTempFile(file); file.transferTo(convertedFile);return convertedFile;}// 方法2: 使用Apache Commons IO工具类publicstaticFileconvertUsingCommonsIO(MultipartFile file)throwsIOException{File convertedFile =createTempFile(file);try(InputStream inputStream = file.getInputStream()){FileUtils.copyInputStreamToFile(inputStream, convertedFile);}return convertedFile;}// 方法3: 使用Java NIO的Files.copy()publicstaticFileconvertUsingNIO(MultipartFile file)throwsIOException{File convertedFile =createTempFile(file);Path targetPath = convertedFile.toPath();Files.copy(file.getInputStream(), targetPath,StandardCopyOption.REPLACE_EXISTING);return convertedFile;}// 方法4: 手动处理输入输出流publicstaticFileconvertManually(MultipartFile file)throwsIOException{File convertedFile =createTempFile(file);try(InputStream inputStream = file.getInputStream()){Files.copy(inputStream, convertedFile.toPath(),StandardCopyOption.REPLACE_EXISTING);}return convertedFile;}// 创建临时文件 小伙伴们可以根据需求改写privatestaticFilecreateTempFile(MultipartFile file)throwsIOException{String originalFilename = file.getOriginalFilename();String prefix = originalFilename !=null? originalFilename.substring(0,Math.min(originalFilename.length(),10)):"upload_";String suffix = originalFilename !=null&& originalFilename.contains(".")? originalFilename.substring(originalFilename.lastIndexOf('.')):".tmp";returnFile.createTempFile(prefix, suffix);}}

构建测试Controller

importorg.springframework.http.ResponseEntity;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.multipart.MultipartFile;importjava.io.File;importjava.io.IOException;importjava.util.HashMap;importjava.util.Map;@RestControllerpublicclassFileUploadController{@PostMapping("/upload")publicResponseEntity<Map<String,Object>>handleFileUpload(@RequestParam("file")MultipartFile file)throwsIOException{Map<String,Object> result =newHashMap<>();// 使用方法1File file1 =FileConverter.convertUsingTransferTo(file); result.put("method1",getFileInfo(file1));// 使用方法2File file2 =FileConverter.convertUsingCommonsIO(file); result.put("method2",getFileInfo(file2));// 使用方法3File file3 =FileConverter.convertUsingNIO(file); result.put("method3",getFileInfo(file3));// 使用方法4File file4 =FileConverter.convertManually(file); result.put("method4",getFileInfo(file4));returnResponseEntity.ok(result);}privateMap<String,Object>getFileInfo(File file){Map<String,Object> info =newHashMap<>(); info.put("path", file.getAbsolutePath()); info.put("size", file.length()+" bytes"); info.put("exists", file.exists());return info;}}

4. 方案对比

方法依赖适用场景临时文件控制
transferTo(File)Spring MVC大多数情况首选由 Spring 管理
Apache Commons IOCommons IO已使用Commons IO的项目简便
手动流复制Java标准库需要精细控制流的情况全程可控
Files.copy (NIO)Java标准库高性能需求场景可控

博主推荐:

如果追求最简洁、且 Spring MVC 默认实现足够可靠,推荐 transferTo
如果项目已有 Commons IO,想用最少的代码量,则选择 Apache Commons IO

5. 结语

Spring BootMultipartFileFile 有多种实现方式,各有适用场景。对于大多数应用,推荐使用 Spring 自带的 transferTo() 方法,它在简洁性和性能之间取得了良好平衡。当项目已包含Apache Commons IO时,使用 FileUtils.copyInputStreamToFile 也是不错的选择。

通过本文相信小伙伴们已经能掌握MultipartFile 转 File 的四种方案,如果你在实践过程中有任何疑问或更好的扩展思路,欢迎在评论区留言,最后希望大家一键三连给博主一点点鼓励!


专栏回顾:
01 Spring Boot 整合 spring-boot-starter-mail 实现邮件发送和账户激活
02 使用Spring Boot自定义注解 + AOP实现基于IP的接口限流和黑白名单
03 Spring Boot 使用自定义注解和自定义线程池实现异步日志记录
04 Spring Boot整合Jasypt 库实现配置文件和数据库字段敏感数据的加解密
05 Spring Boot中整合Jasypt 使用自定义注解+AOP实现敏感字段的加解密
06 Spring Boot整合WebSocket和Redis实现直播间在线人数统计功能
07 Spring Boot通过自定义注解和Redis+Lua脚本实现接口限流
08 Spring Boot整合Redis通过Zset数据类型+定时任务实现延迟队列
09 Spring Boot整合Redis实现发布/订阅功能
10 Spring Boot集成 Spring Retry 实现容错重试机制并附源码
11 Spring Boot 3 整合 SpringDoc OpenAPI 生成接口文档
12 Spring Boot 整合开源 Tess4J库 实现OCR图片文字识别
13 Spring Boot 实现 AOP 动态热插拔功能并附DEMO源码
14 Spring Boot中@Async注解的使用及原理 + 常见问题及解决方案
15 Spring Boot集成OpenPDF和Freemarker实现PDF导出功能并附水印
16 使用Spring Boot整合ip2region获取客户端IP地理位置信息
17 SpringBoot中MyBatis使用自定义TypeHandler
18 Spring Boot 集成 PDFBox 实现PDF电子签章的简单应用
19 实现重试只知道Spring Retry?试试Spring Boot 整合 Fast Retry 来实现重试机制
20 在Spring Boot中使用SeeEmitter类实现EventStream流式编程将实时事件推送至客户端
21 Spring Boot 整合 ShedLock 处理定时任务重复执行的问题
22 视频续播功能实现 - 断点续看从前端到 Spring Boot 后端
23 前端与 Spring Boot 后端无感 Token 刷新 - 从原理到全栈实践

Read more

jdk 17 下载

可从 Oracle 官方 JDK 17 下载页 直接获取适用于 Windows、macOS、Linux 的 JDK 17 安装包Oracle,链接:https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.htmlOracle 下载方式(按系统选择) 系统推荐下载链接备注WindowsWindows x64 安装包Oracle双击运行安装,适合大多数用户macOS IntelmacOS x64 DMGOracle直接安装macOS Apple SiliconmacOS arm64 DMGOracleM1/M2 芯片适用Linux x64Linux x64 压缩包Oracle解压后配置环境变量Linux ARM64Linux arm64 压缩包Oracle树莓派等设备适用 安装与验证 1. 下载 对应系统安装包。 2.

By Ne0inhk
使用飞算JavaAI搞定学生管理系统

使用飞算JavaAI搞定学生管理系统

标签<#JavaAI 飞算 JavaAI 的开发流程颠覆了我对传统开发的认知,整个过程就像和一位经验丰富的架构师实时协作,一下是我对开发学生管理系统的一些理解余流程操作 项目初始化阶段:在打开飞算 JavaAI 后,我创建了名一个"JavaProject" 的新项目,AI自动生成了基础的项目结构,包括IDEA配置文件夹、src 源代码目录、SQL文件夹和核心的 pom.xml 文件。这一步省去了传统开发中手动配置 Maven、设置项目结构的繁琐过程。 这里我自己的实操SQL数据库导入不了 但是在返回代码生成部分,表格设计这一块会有一个自动表格设计,在这里能帮你连接到数据库,后续的JavaAI就能按照这个数据库进行快速创作。 需求定义阶段:在飞算 JavaAI 的智能引导模块,输入了详细的需求,要飞算avaAI开发一个学生成绩管理系统,包含学生信息管理、课程管理、成绩录入、成绩统计分析、数据导出等功能,采用 SpringBoot 框架,MySQL 数据库。让我惊讶的是,

By Ne0inhk

OpenClaw到底是什么?3分钟搞懂AI圈的这些“黑话“

OpenClaw到底是什么?3分钟搞懂AI圈的这些"黑话" 你是不是也经常听到这些词:RAG、MCP、Skills、AI Agent… 每次看到都觉得似懂非懂,却又不好意思问? 今天,我们就用最通俗的话,把这些概念一次性讲清楚! 写在前面 最近刷到一个视频,讲的是 OpenClaw(clawdbot) 这个项目。 说实话,第一反应也是懵的:这又是个啥? 但仔细看完后发现,这个项目其实是个很好的"教材"——它把现在AI圈最火的几个技术串在了一起。搞懂了它,你也就搞懂了整个AI技术栈的底层逻辑。 那么,OpenClaw到底是个啥? 简单说,它就是一个聪明的AI助手框架,把各种AI能力(记忆、检索、工具调用)整合在一起,让AI真的能"干活",而不只是聊天。 先搞清楚一个概念:什么是"

By Ne0inhk
AI的提示词专栏:多语言 Prompt,中文、英文、日文混写的实践

AI的提示词专栏:多语言 Prompt,中文、英文、日文混写的实践

AI的提示词专栏:多语言 Prompt,中文、英文、日文混写的实践 本文围绕多语言 Prompt(中文、英文、日文混写)展开全面实践探讨,先阐述其打破跨语言信息壁垒、提升专业场景精准度、适配多语言用户需求的核心价值,再分析中、英、日三种语言特性对 Prompt 编写的影响,接着提出语言标识清晰、核心需求统一、文化适配性的基础编写原则与语言切换逻辑设计、术语对齐、混合语言优先级设定的进阶技巧。文中结合跨境电商产品文案生成、国际学术论文摘要撰写、跨国企业会议纪要制作三大行业实战案例,展示多语言 Prompt 的应用方法,还针对模型语言混淆、术语翻译偏差、文化适配不当等常见问题给出解决方案,最后总结核心要点并展望自动化语言适配、多模态多语言融合等未来趋势,为全球化场景下多语言 Prompt 的使用提供全面指导。 人工智能专栏介绍     人工智能学习合集专栏是 AI 学习者的实用工具。它像一个全面的 AI 知识库,把提示词设计、AI 创作、智能绘图等多个细分领域的知识整合起来。

By Ne0inhk