一文让你测底明白如何在 Spring Boot 上传中将 MultipartFile 转 File 对象_springboot multipartfile封装到对象
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人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. 前言
- 2. 常见4种转换方案
-
-
- 2.1 使用 transferTo() 方法
- 2.2 使用FileUtils.copyInputStreamToFile
- 2.3 使用 Java NIO Files.copy
- 2.4 手动处理输入输出流
-
- 3. 全局封装及测试
- 4. 方案对比
- 5. 结语
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),将上传内容写入指定文件。
public File convertByTransferTo(MultipartFile multipartFile,String destPath) throws IOException { File destFile = new File(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
依赖
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version></dependency>
调用 commons-io
中提供的 FileUtils
工具类
public static File convertWithCommonsIO(MultipartFile multipartFile, String destPath) throws IOException { File dest = new File(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)上
public static File convertWithNio(MultipartFile multipartFile, String destPath) throws IOException { File destFile = new File(destPath); // 如果目标目录不存在,则创建 File parent = destFile.getParentFile(); if (parent != null && !parent.exists()) { parent.mkdirs(); } try (var in = multipartFile.getInputStream()) { return Files.copy(in, destFile, StandardCopyOption.REPLACE_EXISTING); }}
优点:代码简洁;使用现代 NIO API,可选覆盖或保留原有文件
缺点:需管理目录和文件删除
2.4 手动处理输入输出流
手动通过 InputStream/OutputStream
读取 MultipartFile
的内容,并写入 Java File
。适用于任何实现
public static File convertWithStream(MultipartFile multipartFile) throws IOException { // 创建临时文件,JVM 退出时会尝试删除 String prefix = \"upload_\"; String suffix = \"_\" + multipartFile.getOriginalFilename(); File tempFile = File.createTempFile(prefix, suffix); try (InputStream in = multipartFile.getInputStream(); OutputStream out = new FileOutputStream(tempFile)) { byte[] buffer = new byte[8192]; int len; while ((len = in.read(buffer)) != -1) { out.write(buffer, 0, len); } } return tempFile;}
优点:最通用、可精细控制;无论底层如何实现都可工作
缺点:需要自行管理临时文件删除
3. 全局封装及测试
基于上述的4种方案,我们可以整理成一个工具类,方便后续的使用以及测试
import org.apache.commons.io.FileUtils;import org.springframework.web.multipart.MultipartFile;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.StandardCopyOption;public class FileConverter { // 方法1: 使用transferTo()方法 (Spring推荐) public static File convertUsingTransferTo(MultipartFile file) throws IOException { File convertedFile = createTempFile(file); file.transferTo(convertedFile); return convertedFile; } // 方法2: 使用Apache Commons IO工具类 public static File convertUsingCommonsIO(MultipartFile file) throws IOException { File convertedFile = createTempFile(file); try (InputStream inputStream = file.getInputStream()) { FileUtils.copyInputStreamToFile(inputStream, convertedFile); } return convertedFile; } // 方法3: 使用Java NIO的Files.copy() public static File convertUsingNIO(MultipartFile file) throws IOException { File convertedFile = createTempFile(file); Path targetPath = convertedFile.toPath(); Files.copy(file.getInputStream(), targetPath, StandardCopyOption.REPLACE_EXISTING); return convertedFile; } // 方法4: 手动处理输入输出流 public static File convertManually(MultipartFile file) throws IOException { File convertedFile = createTempFile(file); try (InputStream inputStream = file.getInputStream()) { Files.copy(inputStream, convertedFile.toPath(), StandardCopyOption.REPLACE_EXISTING); } return convertedFile; } // 创建临时文件 小伙伴们可以根据需求改写 private static File createTempFile(MultipartFile file) throws IOException { 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\"; return File.createTempFile(prefix, suffix); }}
构建测试Controller
import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import java.io.File;import java.io.IOException;import java.util.HashMap;import java.util.Map;@RestControllerpublic class FileUploadController { @PostMapping(\"/upload\") public ResponseEntity<Map<String, Object>> handleFileUpload( @RequestParam(\"file\") MultipartFile file) throws IOException { Map<String, Object> result = new HashMap<>(); // 使用方法1 File file1 = FileConverter.convertUsingTransferTo(file); result.put(\"method1\", getFileInfo(file1)); // 使用方法2 File file2 = FileConverter.convertUsingCommonsIO(file); result.put(\"method2\", getFileInfo(file2)); // 使用方法3 File file3 = FileConverter.convertUsingNIO(file); result.put(\"method3\", getFileInfo(file3)); // 使用方法4 File file4 = FileConverter.convertManually(file); result.put(\"method4\", getFileInfo(file4)); return ResponseEntity.ok(result); } private Map<String, Object> getFileInfo(File file) { Map<String, Object> info = new HashMap<>(); info.put(\"path\", file.getAbsolutePath()); info.put(\"size\", file.length() + \" bytes\"); info.put(\"exists\", file.exists()); return info; }}
4. 方案对比
transferTo(File)
Files.copy
(NIO)博主推荐:
如果追求最简洁、且
Spring MVC
默认实现足够可靠,推荐transferTo
如果项目已有Commons IO
,想用最少的代码量,则选择Apache Commons IO
5. 结语
Spring Boot
中 MultipartFile
转 File
有多种实现方式,各有适用场景。对于大多数应用,推荐使用 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 刷新 - 从原理到全栈实践