淺析如何在SpringBoot上傳中將MultipartFile轉(zhuǎn)File對象
1. 前言
在我們開發(fā) Spring Boot Web 應(yīng)用中,文件上傳通常通過 MultipartFile 接口接收。但有時我們需要將 MultipartFile 轉(zhuǎn)成標準的 java.io.File 對象,便于與依賴本地文件 API 的第三方庫(如 Apache POI、Tika、圖像處理庫等)集成,也便于做臨時文件存儲與后續(xù)處理
你可能會有以下需求:
- 第三方庫依賴:如某些 PDF 解析、辦公室文檔處理 API 只接受 File 對象或文件路徑
- 文件處理:對上傳文件進行臨時處理、壓縮、分析;
- 臨時緩存:需要將上傳文件緩存在本地以做異步處理、批量掃描等
那么我們就需要將 MultipartFile 轉(zhuǎn)換 java.io.File 對象,本文博主將講解常見的四種方案,希望小伙伴們閱后能快速掌握。
2. 常見4種轉(zhuǎn)換方案
2.1 使用 transferTo() 方法
transferTo(File) — Spring推薦 最簡潔高效
此方式直接調(diào)用 MultipartFile.transferTo(dest),將上傳內(nèi)容寫入指定文件。
public File convertByTransferTo(MultipartFile multipartFile,String destPath) throws IOException {
File destFile = new File(destPath);
// 如果目標目錄不存在,則創(chuàng)建
File parent = destFile.getParentFile();
if (parent != null && !parent.exists()) {
parent.mkdirs();
}
multipartFile.transferTo(destFile);
return destFile;
}
優(yōu)點:代碼簡潔,直接寫入;
缺點:必須確保 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>
調(diào)用 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;
}
優(yōu)點:極簡;FileUtils 自動管理目錄創(chuàng)建與流關(guān)閉
缺點:需額外 commons-io 依賴
2.3 使用 Java NIO Files.copy
java.nio.file.Files 提供了便捷的方法,將 InputStream 復(fù)制到路徑(Path)上
public static File convertWithNio(MultipartFile multipartFile, String destPath) throws IOException {
File destFile = new File(destPath);
// 如果目標目錄不存在,則創(chuàng)建
File parent = destFile.getParentFile();
if (parent != null && !parent.exists()) {
parent.mkdirs();
}
try (var in = multipartFile.getInputStream()) {
return Files.copy(in, destFile, StandardCopyOption.REPLACE_EXISTING);
}
}
優(yōu)點:代碼簡潔;使用現(xiàn)代 NIO API,可選覆蓋或保留原有文件
缺點:需管理目錄和文件刪除
2.4 手動處理輸入輸出流
手動通過 InputStream/OutputStream 讀取 MultipartFile 的內(nèi)容,并寫入 Java File。適用于任何實現(xiàn)
public static File convertWithStream(MultipartFile multipartFile) throws IOException {
// 創(chuàng)建臨時文件,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;
}
優(yōu)點:最通用、可精細控制;無論底層如何實現(xiàn)都可工作
缺點:需要自行管理臨時文件刪除
3. 全局封裝及測試
基于上述的4種方案,我們可以整理成一個工具類,方便后續(xù)的使用以及測試
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;
}
// 創(chuàng)建臨時文件 小伙伴們可以根據(jù)需求改寫
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);
}
}
構(gòu)建測試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;
@RestController
public 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) | Spring MVC | 大多數(shù)情況首選 | 由 Spring 管理 |
| Apache Commons IO | Commons IO | 已使用Commons IO的項目 | 簡便 |
| 手動流復(fù)制 | Java標準庫 | 需要精細控制流的情況 | 全程可控 |
| Files.copy (NIO) | Java標準庫 | 高性能需求場景 | 可控 |
博主推薦:
如果追求最簡潔、且 Spring MVC 默認實現(xiàn)足夠可靠,推薦 transferTo
如果項目已有 Commons IO,想用最少的代碼量,則選擇 Apache Commons IO
5. 結(jié)語
Spring Boot中 MultipartFile 轉(zhuǎn) File 有多種實現(xiàn)方式,各有適用場景。對于大多數(shù)應(yīng)用,推薦使用 Spring 自帶的 transferTo() 方法,它在簡潔性和性能之間取得了良好平衡。當項目已包含Apache Commons IO時,使用 FileUtils.copyInputStreamToFile 也是不錯的選擇。
到此這篇關(guān)于淺析如何在SpringBoot上傳中將MultipartFile轉(zhuǎn)File對象的文章就介紹到這了,更多相關(guān)SpringBoot MultipartFile轉(zhuǎn)File對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot+MultipartFile實現(xiàn)單文件,多文件批量上傳過程
- Springboot獲取文件內(nèi)容如何將MultipartFile轉(zhuǎn)File
- Springboot MultipartFile文件上傳與下載的實現(xiàn)示例
- Springboot?上傳文件或頭像(MultipartFile、transferTo)
- SpringBoot 利用MultipartFile上傳本地圖片生成圖片鏈接的實現(xiàn)方法
- 文件上傳SpringBoot后端MultipartFile參數(shù)報空問題的解決辦法
- 解決springboot MultipartFile文件上傳遇到的問題
相關(guān)文章
Java+MyBatis+MySQL開發(fā)環(huán)境搭建流程詳解
Java的MyBatis框架提供了強大的數(shù)據(jù)庫操作支持,這里我們先在本地的開發(fā)環(huán)境中上手,來看一下Java+MyBatis+MySQL開發(fā)環(huán)境搭建流程詳2016-06-06
SpringBoot2 整合Ehcache組件,輕量級緩存管理的原理解析
這篇文章主要介紹了SpringBoot2 整合Ehcache組件,輕量級緩存管理,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
SiteMesh如何結(jié)合Freemarker及velocity使用
這篇文章主要介紹了SiteMesh如何結(jié)合Freemarker及velocity使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10
mybatisplus如何在xml的連表查詢中使用queryWrapper
這篇文章主要介紹了mybatisplus如何在xml的連表查詢中使用queryWrapper,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
Spring Boot實現(xiàn)郵件服務(wù)(附:常見郵箱的配置)
這篇文章主要給大家介紹了關(guān)于Spring Boot實現(xiàn)郵件服務(wù)的相關(guān)資料,文中還附上了常見郵箱的配置,通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-12-12
java?stream實現(xiàn)分組BigDecimal求和以及自定義分組求和
這篇文章主要給大家介紹了關(guān)于java?stream實現(xiàn)分組BigDecimal求和以及自定義分組求和的相關(guān)資料,Stream是Java8的一大亮點,是對容器對象功能的增強,它專注于對容器對象進行各種非常便利、高效的聚合操作或者大批量數(shù)據(jù)操作,需要的朋友可以參考下2023-12-12
Java基礎(chǔ)之選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu)
這篇文章主要介紹了Java基礎(chǔ)之選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu),文中有非常詳細的代碼示例,對正在學習java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04

